题目来源
我的题解
方法一 滑动窗口
若k=0,直接返回一个0数组;
k!=0,则先计算一个|k|长度的窗口和,然后依次计算以i位置为开始的|k|长度的数组和,将每个位置的|k|长度数组和存放到preSum数组中。
若k>0,则res[i]=preSum[(i+1)%n]
若k<0,则res[i]=preSum[(i+n+k)%n];
时间复杂度:O(n)
空间复杂度:O(n)
public int[] decrypt(int[] code, int k) {
int n=code.length;
int[] preSum=new int[n];
int zK=Math.abs(k);
int[] res=new int[n];
if(k==0){
return res;
}
int sum=getKSum(code,zK);
preSum[0]=sum;
for(int i=1;i<n;i++){
sum=sum-code[i-1]+code[(i+zK-1)%n];
preSum[i]=sum;
}
for(int i=0;i<n;i++){
if(k>0){
res[i]=preSum[(i+1)%n];
}else{
res[i]=preSum[(i+n+k)%n];
}
}
return res;
}
public int getKSum(int[] code,int k){
int sum=0;
for(int i=0;i<k;i++){
sum+=code[i];
}
return sum;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~