【每日一题】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

相关文章

哈希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 &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

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

题目: 题解: 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 & MASK1) == 0) {return

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou