LC每日一题|20240505 - 1652. 拆炸弹

85 阅读1分钟

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.length
  • 1 <= n <= 100
  • 1 <= 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)