LeetCode 1652. 拆炸彈 模擬
阿新 • • 發佈:2020-12-12
地址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; } };