1168. 数组评分
有一个数组numsnums,以及三个正整数k,u,lk,u,l。
对于numsnums的所有长为kk的子段,如果它的总和小于uu,就得11分,如果它的总和大于ll,就扣11分。
请求出最终能获得多少分?
样例
样例输入:
nums = [0, 1, 2, 3, 4]
k = 2
u = 2
l = 5
样例输出:
0
说明
下列样例中,[0, 1, 2, 3, 4][0,1,2,3,4]所有的长为 22 的子段分别是[0, 1], [1, 2], [2, 3], [3, 4][0,1],[1,2],[2,3],[3,4],它们的和分别为1,3,5,71,3,5,7。其中 1<21<2,加一分,7>57>5,扣一分。总计00分。
注意事项
numsnums的长度为nn,
1 \leq n \leq 10^5
1≤n≤1
0
5
。
nums_i
num
s
i
为numsnums中的元素,
0 \leq nums_i \leq 10^5
0≤num
s
i
≤1
0
5
。
1 \leq k \leq n1≤k≤n。
1 \leq u \leq l \leq 10^{10}
1≤u≤l≤1
0
10
。
最后的得分可以是负数。
输入测试数据 (每行一个参数)如何理解测试数据?
public class Solution {
/**
* @param nums: the array to be scored.
* @param k: the requirement of subarray length.
* @param u: if the sum is less than u, get 1 score.
* @param l: if the sum is greater than l, lose 1 score.
* @return: return the sum of scores for every subarray whose length is k.
*/
public int arrayScore(List<Integer> nums, int k, long u, long l) {
// write your code here.
int sum = 0;
long ret = 0;
int i = 0;
for (; i < k; i++) {
ret += nums.get(i);
}
if (ret<u)sum++;
if (ret>l)sum--;
for (int j=0; i < nums.size(); ) {
ret=ret-nums.get(j)+nums.get(i);
if (ret<u)sum++;
if (ret>l)sum--;
// System.out.println(ret+","+sum);
i++;
j++;
}
return sum;
}
}