目录
一、题目
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;
    }
};