每日一题——LeetCode1652.拆炸弹

方法一 分类讨论

  • k=0,直接返回一个和原数组长度一样但元素都为0的数组
  • k>0,先求出前k个元素的和preSum,初始化index=k,每次循环preSum减去当前元素codei,再加上codeindex,保证preSum的值始终是当前元素后k个元素的和,如果index到了数组末尾需要跳转到数组开头
  • k<0,同理,只是index记录的是需要减去的元素的位置,preSum先减codeindex,然后加上codei的前一个元素,preSum始终记录的是codei前k个元素的和

写完后发现k>0 ,k<0方法其实是一样的,考虑是否能将这两种情况合并,缩减代码

javascript 复制代码
var decrypt = function(code, k) {
    if(k===0) return new Array(code.length).fill(0)
    let res=[]
    if(k>0){
        let preSum=0,index=k
        for(let i=0;i<k;i++){
            preSum+=code[i]
        }
        for(let i=0;i<code.length;i++){
            preSum-=code[i]
            preSum+=code[index]
            if(index==code.length-1){
                index=-1
            }
            index++
            res.push(preSum)
        }
    }else{
       let index=code.length+k,preSum=0
       for(let i=index;i<code.length;i++){
           preSum+=code[i]
       } 
       res.push(preSum)
       for(let i=0;i<code.length-1;i++){
           preSum-=code[index]
           if(index==code.length-1){
               index=-1
           }
           index++
           preSum+=code[i]
           res.push(preSum)
       }
    }
    return res
};

消耗时间和内存情况:

方法二 滑动窗口

无论k大于0还是小于0,其实都是一个长度为k的绝对值的窗口,窗口往右移动,每次去掉窗口的第一个值,加入窗口的后一个值,当窗口的左边界或右边界到达数组末尾就要跳转到数组开头,每次窗口的和就是一个密码值

javascript 复制代码
var decrypt = function(code, k) {
    if(k===0) return new Array(code.length).fill(0)
    let res=[],start=0,end=0,preSum=0
    if(k>0){
       start=0,end=k-1
    }else{
       start=code.length+k-1,end=start-k-1
    }
    for(let i=start;i<=end;i++){
        preSum+=code[i]
    }
    for(let i=0;i<code.length;i++){
        preSum-=code[start]
        start++
        if(start==code.length) start=0

        end++
        if(end==code.length) end=0
        preSum+=code[end]

        res.push(preSum)
    }
    return res
};

消耗时间和内存情况:

相关推荐
en.en..几秒前
Linux 进程退出exit(函数)
java·开发语言·算法
web打印社区8 分钟前
Windows 网页静默打印设置步骤:客户端、防火墙与联调清单
开发语言·前端·javascript·chrome·pdf·ecmascript
All for pursuit.19 分钟前
【回溯-2】22.括号生成
数据结构·c++·算法·leetcode
longlongzihan38 分钟前
LeetCode 1004.最大连续1的个数III 滑动窗口及动态规划题解
c++·算法·leetcode·dp·滑动窗口
朝朝辞暮i44 分钟前
C++ 第 22 课:const —— 不允许随便修改的数据
开发语言·c++·算法
web打印社区1 小时前
JS 静默打印怎么做:纯前端为什么不行,以及最小可跑通写法
开发语言·前端·javascript·websocket·网络协议·http·pdf
web打印社区1 小时前
HTML5 静默打印:前端页面怎么调用打印机且尽量不弹窗
前端·javascript·vue.js·pdf·html·html5
Chen—LSN1 小时前
数据结构——拿捏复杂度
java·c语言·开发语言·数据结构·经验分享·笔记·算法
Chen_harmony1 小时前
六、排序详解
c语言·数据结构·算法·排序算法
-dzk-1 小时前
【贪心算法】LC 55.跳跃游戏
算法·游戏·贪心算法