超时/低效错误,带“无效”;至于;Javascript中的loop和array.reduce
通过codewars挑战超时/低效错误,带“无效”;至于;Javascript中的loop和array.reduce,javascript,arrays,loops,optimization,Javascript,Arrays,Loops,Optimization,通过codewars挑战(简单的乐趣#237:后缀和),当我通过所有测试时,它会给我一个超时错误。挑战在于从给定数组生成一个新数组,其中新数组的每个索引都是原始数组中相同索引到原始数组末尾的总和 对于数组1,2,3,-6,的输出应该是0,-1,-3,-6。 b[0]= 1 + 2 + 3 - 6 = 0 b[1]= 2 + 3 - 6 = -1 b[2]= 3 - 6 = -3 b[3]= - 6 = -6 我的密码是 functio
(简单的乐趣#237:后缀和)
,当我通过所有测试时,它会给我一个超时错误。挑战在于从给定数组生成一个新数组,其中新数组的每个索引都是原始数组中相同索引到原始数组末尾的总和
对于数组1,2,3,-6,
的输出应该是0,-1,-3,-6。
b[0]= 1 + 2 + 3 - 6 = 0
b[1]= 2 + 3 - 6 = -1
b[2]= 3 - 6 = -3
b[3]= - 6 = -6
我的密码是
function suffixSums(a) {
var res=[]
for(i=0;i<a.length;i++){
var newarray=a.slice([i])
res.push(newarray.reduce(function(acc, val){ return acc + val },0))
}
return res
}
函数后缀(a){
var res=[]
对于(i=0;i您是在浪费时间,因为您从头开始计算每个项目的总和,您可以从数组的末尾开始,并在运行时累积总和:
函数后缀(a){
var res=[],
sum=0;//从结束到当前索引的项的总和(用0初始化)
对于(var i=a.length-1;i>=0;i--){//从末尾开始循环
sum+=a[i];//将当前数字添加到sum中
res[i]=sum;//将sum添加到索引i处的结果数组中(此行可以更改为:res.unshift(sum);)
}
返回res;
}
log(后缀([1,2,3,-6]);
如果您不介意更改原始数组(Codewars不介意):
您可以使用项的后续项,并在从末尾进行迭代时添加实际值
函数后缀(a){
var i=a.长度-1;
而(我--){
a[i]+=a[i+1];
}
返回a;
}
log(后缀([1,2,3,-6]);
我会像这样做
var arr=[1,2,3,-6],
res=arr.reduceRight((r,n)=>r[0]==void 0?[n]:[n+r[0]]。concat(r),[]);
console.log(res)
提示:从结尾开始。太棒了!谢谢你的评论,这很有帮助。默认思维方式肯定是从左到右,我没有想到要切换it@skdfsdfa你也可以从左到右,你只需要从每个element@Bergi从左到右是不可撤销的,除非你已经得到了总数,在这种情况下你必须循环数组两次。@ibrahimmahrir单通或双通对算法复杂度没有影响:-)
function suffixSums(a) {
for(var i = a.length - 2; i > -1; i--)
a[i] += a[i+1];
return a;
}