目录
一、题目
1、题目描述
你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为
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
,请你返回解密后的结果来拆除炸弹!
2、接口描述
python3
python
class Solution:
def decrypt(self, code: List[int], k: int) -> List[int]:
cpp
cpp
class Solution {
public:
vector<int> decrypt(vector<int>& code, int k) {
}
};
3、原题链接
二、解题报告
1、思路分析
对于环形问题往往只需要对下标取模就可以解决
我们考虑维护长度为k的滑窗不断滑动,维护滑窗内的和,完成n个元素的计算
2、复杂度
时间复杂度: O(n)空间复杂度:O(1)
3、代码详解
python3
python
class Solution:
def decrypt(self, code: List[int], k: int) -> List[int]:
n = len(code)
r = k + 1 if k > 0 else n
k = abs(k)
s = sum(code[r - k: r])
ret = [0] * n
for i in range(n):
ret[i] = s
s += code[r % n] - code[(r - k) % n]
r += 1
return ret
cpp
cpp
class Solution {
public:
vector<int> decrypt(vector<int>& code, int k) {
int n = code.size();
int r = k > 0 ? k + 1 : n;
k = abs(k);
int s = accumulate(code.begin() + r - k, code.begin() + r, 0);
vector<int> ret(n);
for(int i = 0; i < n; i ++){
ret[i] = s;
s += code[r % n] - code[(r - k) % n];
r ++;
}
return ret;
}
};