本文主要是介绍每日一题——LeetCode1652.拆炸弹,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
方法一 分类讨论
- k=0,直接返回一个和原数组长度一样但元素都为0的数组
- k>0,先求出前k个元素的和preSum,初始化index=k,每次循环preSum减去当前元素code[i],再加上code[index],保证preSum的值始终是当前元素后k个元素的和,如果index到了数组末尾需要跳转到数组开头
- k<0,同理,只是index记录的是需要减去的元素的位置,preSum先减code[index],然后加上code[i]的前一个元素,preSum始终记录的是code[i]前k个元素的和
写完后发现k>0 ,k<0方法其实是一样的,考虑是否能将这两种情况合并,缩减代码
var decrypt = function(code, k) {if(k===0) return new Array(code.length).fill(0)let res=[]if(k>0){let preSum=0,index=kfor(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=0for(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的绝对值的窗口,窗口往右移动,每次去掉窗口的第一个值,加入窗口的后一个值,当窗口的左边界或右边界到达数组末尾就要跳转到数组开头,每次窗口的和就是一个密码值
var decrypt = function(code, k) {if(k===0) return new Array(code.length).fill(0)let res=[],start=0,end=0,preSum=0if(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=0end++if(end==code.length) end=0preSum+=code[end]res.push(preSum)}return res
};
消耗时间和内存情况:
这篇关于每日一题——LeetCode1652.拆炸弹的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!