数组的总和-JavaScript

Hap*_*s31 8 javascript arrays reduce sum

试图解决代码战中的这一挑战。根据挑战,数组的部分:

ls = [0, 1, 3, 6, 10]

ls = [0, 1, 3, 6, 10]
ls = [1, 3, 6, 10]
ls = [3, 6, 10]
ls = [6, 10]
ls = [10]
ls = []
Run Code Online (Sandbox Code Playgroud)

我们需要返回一个包含这些部分之和的数组。

所以我的代码如下:

ls = [0, 1, 3, 6, 10]
ls = [1, 3, 6, 10]
ls = [3, 6, 10]
ls = [6, 10]
ls = [10]
ls = []
Run Code Online (Sandbox Code Playgroud)

问题在于,它希望我们在数组为空时将最后一个总和0加。所以我们应该得到:

[20,20,19,16,10,0]

代替

[20、20、19、16、10]

所以我尝试了这个:

function partsSums(ls) {
  let arrayOfSums = []; 
  while(ls.length > 0) {
    let sum = ls.reduce((a, b) => a + b);
    arrayOfSums.push(sum);
    ls.shift();
  }
return arrayOfSums;
}

console.log(partsSums([0, 1, 3, 6, 10]));
Run Code Online (Sandbox Code Playgroud)

和这个:

function partsSums(ls) {
  let arrayOfSums = []; 
  while(ls.length > 0) {
    let sum = ls.reduce((a, b) => a + b);
    arrayOfSums.push(sum);
    ls.shift();
  }
arrayOfSums.push(0);
return arrayOfSums;
}
console.log(partsSums([0, 1, 3, 6, 10]));
Run Code Online (Sandbox Code Playgroud)

但是,这些导致了Codewars上的执行超时错误:

执行超时(12000毫秒)

所以我也尝试了:

function partsSums(ls) {
  ls.push(0);
  let arrayOfSums = []; 
  while(ls.length > 0) {
    let sum = ls.reduce((a, b) => a + b);
    arrayOfSums.push(sum);
    ls.shift();
  }
return arrayOfSums;
}
Run Code Online (Sandbox Code Playgroud)

但这现在导致TypeError:

TypeError:减少没有初始值的空数组

我不了解在将所有值都移出后如何将0放入数组的概念。即使数组为空,挑战似乎也想将0作为数组的最终“和”。但是您不能减少一个空数组-在这里我还能做什么?

编辑:尝试将初始值添加到reduce方法:

function partsSums(ls) {
  let arrayOfSums = []; 
  while(ls.length > 0) {
    let sum = ls.reduce((a, b) => a + b, 0);
    arrayOfSums.push(sum);
    ls.shift();
  }
return arrayOfSums;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这仍然未能通过基本测试:

预期[]深度等于[0]

Mar*_*yer 10

没有理由一遍又一遍地计算总和。在长数组上,这将是非常低效的(O(n²)),并可能解释您的超时错误。在开始时计算总和,然后在循环中从中减去每个元素。

ls = [0, 1, 3, 6, 10]

function partsSums(ls) {
    let sum = ls.reduce((sum, n) => sum + n, 0)
    res  = [sum]
    for (let i = 1; i <= ls.length; i++){
        sum -= ls[i-1]
        res.push(sum )
    }
    return res
}
console.log(partsSums(ls))
Run Code Online (Sandbox Code Playgroud)

  • 因此,为了进一步细分,我们将第一个总和设置为“20”,然后在 for 循环中,我们创建“结果”数组,将其初始化为“20”。然后我们从总和中减去“ls[i - 1]”。因此,从 for 循环推入结果数组的第一个总和也将是“20”,因为在本例中“ls[i - 1]”是“0”。然后是 20 - 1,然后是 19 - 3,等等。有道理 - 谢谢。 (2认同)

Fra*_*ion 5

通过所有测试的另一个解决方案:

function partsSums(ls) {
    let result = [0],
      l = ls.length - 1;
      
    for (let i = l; i >= 0; i--) {
        result.push(ls[i] + result[ l - i]);
    }
    return result.reverse();
}


console.log(partsSums([]));
console.log(partsSums([0, 1, 3, 6, 10])); 
console.log(partsSums([1, 2, 3, 4, 5, 6]));
console.log(partsSums([744125, 935, 407, 454, 430, 90, 144, 6710213, 889, 810, 2579358]));
Run Code Online (Sandbox Code Playgroud)