题目地址:
https://leetcode.com/problems/defuse-the-bomb/
给定一个数组 A A A,将每个数替换为其后的 k k k个数之和。如果 k k k是负数,则替换为其前的 k k k个数之和。如果 k k k是 0 0 0则返回零数组。如果越界了,将 A A A当成循环数组来做。题目保证 ∣ k ∣ ≤ l A − 1 |k|\le l_A-1 ∣k∣≤lA−1。
如果 k k k是负数,可以先将 A A A翻转一下,然后当成 k k k是正数来做,最后再翻转回来。代码如下:
public class Solution {
public int[] decrypt(int[] code, int k) {
if (k == 0) {
return new int[code.length];
}
boolean reversed = false;
if (k < 0) {
k = -k;
reverse(code);
reversed = true;
}
int[] res = new int[code.length];
int sum = 0;
// 算一下A[1 : k]这些数之和
for (int i = 1; i < 1 + k; i++) {
sum += code[i];
}
res[0] = sum;
for (int i = 1; i < code.length; i++) {
sum -= code[i];
sum += code[(i + k) % code.length];
res[i] = sum;
}
if (reversed) {
reverse(res);
}
return res;
}
private void reverse(int[] nums) {
for (int i = 0, j = nums.length - 1; i < j; i++, j--) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
}
时间复杂度 O ( l A ) O(l_A) O(lA),空间 O ( 1 ) O(1) O(1)。