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)
通过所有测试的另一个解决方案:
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)