LC每日一题|20240505 - 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,请你返回解密后的结果来拆除炸弹!
提示:
n == code.length1 <= n <= 1001 <= code[i] <= 100-(n - 1) <= k <= n - 1
题目等级:Easy
解题思路
很简单的一道前缀和的题~
唯一一点需要注意的是在处理坐标时需要一丢丢耐心~
AC代码
class Solution {
fun decrypt(code: IntArray, k: Int): IntArray {
val sum = IntArray(code.size + 1)
for (i in code.indices) sum[i + 1] = sum[i] + code[i]
for (i in code.indices) code[i] = when {
k > 0 -> if (k < code.size - i) sum[i + k + 1] - sum[i + 1] else sum.last() - sum[i + 1] + sum[i + k + 1 - code.size]
k < 0 -> if (-k < i) sum[i] - sum[i + k] else sum[i] + sum.last() - sum[code.size + i + k]
else -> 0
}
return code
}
}
时间复杂度:O(n)
空间复杂度:O(n)