"对于"超时/低效率错误在Javascript中循环和array.reduce

时间:2017-05-04 16:19:21

标签: javascript arrays loops optimization

完成代码战挑战(Simple Fun #237: Suffix Sums),并且在我通过所有测试时,它会给我一个超时错误。挑战是从给定的数组创建一个新数组,其中新数组的每个索引是原始数组中相同索引与原始数组末尾的总和。

对于数组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
}

任何线索是什么?我显然还在学习,优化对我来说是一个全新的世界

4 个答案:

答案 0 :(得分:1)

您可以使用项目的后继项,并在从最后迭代时添加实际值。

function suffixSums(a) {
    var i = a.length - 1;
    while (i--) {
        a[i] += a[i + 1];
    }
    return a;
}

console.log(suffixSums([1, 2, 3, -6]));

答案 1 :(得分:0)

你是在浪费时间,因为你从头开始计算每个项目的总和,你可以从数组的末尾开始并在你去的时候累积总和:

function suffixSums(a) {
    var res = [],
        sum = 0;                              // sum of items from end to the current index (initialized with 0)
    for(var i = a.length - 1; i >= 0; i--) {  // loop from the end
       sum += a[i];                           // add the current number to sum
       res[i] = sum;                          // add the sum to the result array at index i (this line could be changed to: res.unshift(sum);)
    }
    return res;
}

console.log(suffixSums([1, 2, 3, -6]));

答案 2 :(得分:0)

如果您不介意更改原始阵列(Codewars不介意):

function suffixSums(a) {
 for(var i = a.length - 2; i > -1; i--)
   a[i] += a[i+1];
 return a;
}

答案 3 :(得分:0)

我会做这样的工作;

var arr = [1, 2, 3, -6],
    res = arr.reduceRight((r,n) => r[0] === void 0 ? [n] : [n+r[0]].concat(r),[]);
console.log(res);