codility 题库 java,codility上的习题(3)

codility上的练习(3)

今天发现又出了lesson 3...

不过题目都很简单……

(1) Min-avg-slice

给定一个长度为n的整数数组,找到一个连续的子数组,数组元素的平均值最小。 数据范围N [1..10^5],数组元素范围[-10^4, +10^4]。

要求复杂度: 时间O(N),空间O(N)。

分析: 就是求最小值……因为如果拉进别的数,平均值会增大,干嘛搞成这样,空间可以O(1)。说得神乎其神的……

代码:

// you can also use includes, for example:

// #include

int solution(vector &A) {

// write your code here...

int i,j,n = A.size();

for (i = j = 0; i < n; ++i) {

if (A[i] < A[j]) {

j = i;

}

}

return A[j];

}

(2) Passing-cars

给定一个长度为N的0-1数组A,它表示一条路上的车流方向,下标从0开始,要找到0<=P<=Q

要求复杂度: 时间O(N),空间O(1)。

分析: 实质对于每个0,我们求它后面有多少个1即可。所以我们倒着遍历数组,对每个0,看一下截止到目前为止的后缀和即可。

代码:

// you can also use includes, for example:

// #include

int solution(vector &A) {

// write your code here...

int i,sum,answer;

for (answer = sum = 0, i = A.size() - 1; i >= 0; --i) {

if (A[i]) {

++sum;

}

else if ((answer += sum) > 1000000000) {

return -1;

}

}

return answer;

}

(3) Genomic-range-query

给定一个字符串,代表基因,只包含ACGT,4个字符,假设它们分别代表整数1,2,3,4,再给定M个查询P,Q, (P[i],Q[i])表示从查询原串下标P[i]到Q[i]之间的最小值,字符串长度N [1..10^5],查询个数M [1..50000]。要求复杂度 时间O(N + M),空间O(N)。

分析: 本来是线段树的题目,但是因为只有4种值,所以我们可以记录下前n项1,2,3,4分别出现了多少次,这样通过减法,我们就知道查询段内每个数出现的次数,自然知道最小值了。

代码:

// you can also use includes, for example:

// #include

vector solution(string &S, vector &P, vector &Q) {

// write your code here...

vector > have;

int i,j,n = S.size();

have.resize(n + 1);

have[0].resize(4, 0);

for (i = 1; i <= n; ++i) {

have[i] = have[i - 1];

switch(S[i - 1]) {

case 'A':

++have[i][0];

break;

case 'C':

++have[i][1];

break;

case 'G':

++have[i][2];

break;

case 'T':

++have[i][3];

break;

}

}

n = P.size();

vector answer;

answer.resize(n);

for (i = 0; i < n; ++i) {

for (j = 0; j < 4; ++j) {

if (have[Q[i] + 1][j] - have[P[i]][j]) {

answer[i] = j + 1;

break;

}

}

}

return answer;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值