1. 程式人生 > 實用技巧 >LeetCode 1652. 拆炸彈 模擬

LeetCode 1652. 拆炸彈 模擬

地址https://leetcode-cn.com/problems/defuse-the-bomb/

你有一個炸彈需要拆除,時間緊迫!你的情報員會給你一個長度為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,請你返回解密後的結果來拆除炸彈!



示例 
1: 輸入:code = [5,7,1,4], k = 3 輸出:[12,10,16,13] 解釋:每個數字都被接下來 3 個數字之和替換。解密後的密碼為 [7+1+4, 1+4+5, 4+5+7, 5+7+1]。注意到陣列是迴圈連線的。 示例 2: 輸入:code = [1,2,3,4], k = 0 輸出:[0,0,0,0] 解釋:當 k 為 0 時,所有數字都被 0 替換。 示例 3: 輸入:code = [2,4,9,3], k = -2 輸出:[12,5,6,13] 解釋:解密後的密碼為 [3+9, 2+3, 4+2, 9+4] 。注意到陣列是迴圈連線的。如果 k 是負數,那麼和為 之前 的數字。 提示: n
== code.length 1 <= n<= 100 1 <= code[i] <= 100 -(n - 1) <= k <= n - 1

演算法1
一道模擬題
主要是考慮 環形陣列在正向和逆向的迴圈中的邊界處理
注意 c++中對負數取模與預想的有出入

C++ 程式碼

class Solution {
public:
    vector<int> ans;
    void change(int idx, const vector<int>& code, int k)
    {
        if (k == 0) {
            ans[idx] 
= 0; return; } while(k!=0){ int curr = idx + k; while (curr < 0) curr += ans.size(); curr = curr % ans.size(); ans[idx] += code[curr]; if (k > 0) k--; else k++; } } vector<int> decrypt(vector<int>& code, int k) { ans = vector<int> (code.size()); for (int i = 0; i < code.size(); i++) { change(i, code, k); } return ans; } };