【每日一题】LeetCode 1652.拆炸弹(数组、滑动窗口)

2024-09-06 09:52

本文主要是介绍【每日一题】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; // 返回解密后的结果}
}

这篇关于【每日一题】LeetCode 1652.拆炸弹(数组、滑动窗口)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141693

相关文章

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &