【每日一题】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 来计算每个位置上的新值。我们可以按照以下步骤来解决这个问题:

  1. 首先,我们需要初始化一个与 code 数组同样长度的数组 ans 来存储最终的结果。
  2. 根据 k 的值,我们确定循环的半径。如果 k 是正数,我们只需要考虑后面的 k 个数字;如果 k 是负数,我们需要考虑前面的 k 个数字;如果 k0,则所有位置的值都设置为 0
  3. 我们使用一个变量 s 来存储当前位置的数字和,这个和是基于当前位置的数字以及它后面(或前面,取决于 k 的正负)的 k 个数字。
  4. 我们遍历数组 code,对于每个位置,我们更新 s 的值,将当前位置的数字替换为 s,然后将 s 更新为下一个位置的和。
  5. 最后,我们返回填充好的数组 ans

输入示例

  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]
    • 解释:当 k0 时,所有数字都被 0 替换。
  3. 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; // 返回解密后的结果
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值