天天看点

【Leetcode】1652. Defuse the Bomb题目地址:

题目地址:

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)。