题目:
你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。
为了获得正确的密码,你需要替换掉每一个数字。所有数字会 同时 被替换。
- 如果 k > 0,将第i个数字用 接下来k个数字之和替换。
- 如果 k < 0,将第i个数字用 之前k个数字之和替换。
- 如果 k == 0,将第i个数字用0替换。
由于 code 是循环的, code[n-1] 下一个元素是 code[0] ,且 code[0] 前一个元素是 code[n-1] 。
给你 循环 数组 code 和整数密钥 k ,请你返回解密后的结果来拆除炸弹!

提示:
- n == code.length
- 1 <= n <= 100
- 1 <= code[i] <= 100
- -(n - 1) <= k <= n - 1
思考:
当k=0时,直接返回全为0的数组;当k>0或者k<0时,每个元素都由其他的k个元素之和代替,很容易想到用滑动窗口解决,每次减去滑动窗口里的第一个元素(索引设为left),加上窗口后的第一个元素(索引设为right),即为当前元素更新的值。
另外要注意当left或right更新到越过数组边界时,需要重新设为0(因为数组code是循环数组),避免数组越界。代码如下:
class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        n = len(code)
        ans = []
        if k == 0:
            return [0 for _ in range(n)]
        elif k > 0:
            left = 1
            right = k
        elif k < 0:
            left = n + k
            right = n - 1
        window = sum(code[left:right+1])   # 初始化滑动窗口
        for i in range(n):
            ans.append(window)
            right += 1
            if right == n:
                right = 0
            window = window - code[left] + code[right]
            left += 1
            if left == n:
                left = 0
        return ans提交通过:
 
 



















