本文主要是介绍【每日一题】LeetCode 1652.拆炸弹(数组、滑动窗口),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【每日一题】LeetCode 1652.拆炸弹(数组、滑动窗口)
题目描述
你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 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
,请你返回解密后的结果来拆除炸弹!
思路分析
这个问题的关键在于理解如何通过循环数组和给定的密钥 k
来计算每个位置上的新值。我们可以按照以下步骤来解决这个问题:
- 首先,我们需要初始化一个与
code
数组同样长度的数组ans
来存储最终的结果。 - 根据
k
的值,我们确定循环的半径。如果k
是正数,我们只需要考虑后面的k
个数字;如果k
是负数,我们需要考虑前面的k
个数字;如果k
是0
,则所有位置的值都设置为0
。 - 我们使用一个变量
s
来存储当前位置的数字和,这个和是基于当前位置的数字以及它后面(或前面,取决于k
的正负)的k
个数字。 - 我们遍历数组
code
,对于每个位置,我们更新s
的值,将当前位置的数字替换为s
,然后将s
更新为下一个位置的和。 - 最后,我们返回填充好的数组
ans
。
输入示例
-
code = [5,7,1,4], k = 3
- 输出:
[12,10,16,13]
- 解释:每个数字都被接下来 3 个数字之和替换。解密后的密码为
[7+1+4, 1+4+5, 4+5+7, 5+7+1]
。
- 输出:
-
code = [1,2,3,4], k = 0
- 输出:
[0,0,0,0]
- 解释:当
k
为0
时,所有数字都被0
替换。
- 输出:
-
code = [2,4,9,3], k = -2
- 输出:
[12,5,6,13]
- 解释:解密后的密码为
[3+9, 2+3, 4+2, 9+4]
。如果k
是负数,那么和为之前 的数字。
- 输出:
代码实现
class Solution {public int[] decrypt(int[] code, int k) {int n = code.length; // 数组长度int[] ans = new int[n]; // 初始化答案数组int r; // 循环的半径if (k > 0) {r = k + 1; // 如果 k 是正数,只考虑后面的 k 个数字} else {r = n; // 如果 k 是负数或 0,考虑整个数组}k = Math.abs(k); // 获取 k 的绝对值int s = 0; // 初始化当前位置的数字和// 计算初始的数字和for (int i = r - k - 1; i < r; i++) {s += code[i % n]; // 使用模运算确保索引不会超出数组范围}// 遍历数组,更新答案数组和数字和for (int i = 0; i < n; i++) {ans[i] = s; // 将当前位置的数字和赋值给答案数组s += code[(r + i) % n] - code[(r + i - k) % n]; // 更新数字和}return ans; // 返回解密后的结果}
}
这篇关于【每日一题】LeetCode 1652.拆炸弹(数组、滑动窗口)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!