当
k
k
k很大,远远超过
c
h
a
l
k
chalk
chalk数组的和
t
o
t
a
l
total
total时,应该对
t
o
t
a
l
total
total取余,减少我们寻找的轮次。
取余后,
k
<
t
o
t
a
l
k<total
k<total,我们只需遍历一次就能找出需要补充粉笔的学生编号。
其中,有一个问题就是,当数组中的数字很大时,其和 t o t a l total total可能会超出 i n t int int范围。解决办法是用 l o n g l o n g long\ long long long类型来保存求和结果。
int chalkReplacer(int* chalk, int chalkSize, int k){
long long total = 0;
for(int i=0; i<chalkSize; i++)
{
total += chalk[i];
}
k = k % total;
for(int i=0; i<chalkSize; i++)
{
k -= chalk[i];
if(k < 0) return i;
}
return 0;
}
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)。