题目:
你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 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
提交通过: