# [ACCEPTED]-Sum of Parts of An Array - JavaScript-reduce

Accepted answer
Score: 11

There is no reason to compute the sum over 5 and over. On a long array this will be very 4 inefficient ( O(n²) ) and might explain 3 your timeout errors. Compute the sum at 2 the beginning and then subtract each element 1 from it in a loop.

``````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))``````
Score: 5

Another solution that passed all of the 1 tests:

``````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]));``````
Score: 1

You could use `for` loop with `slice` and when `i == 0` you 4 can slice `len + 1` which is going to return you 3 empty array and sum will be 0.

``````function partsSums(arr) {
const res = [], len = arr.length
for (let i = len; i > -1; i--) {
res.push(arr.slice(-i || len + 1).reduce((a, n) => a + n, 0))
}
return res;
}

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]));``````

You can also 2 use two double `reduce` and if there is no next 1 element push zero.

``````function partsSums(arr) {
const sum = arr => arr.reduce((r, e) => r + e, 0);
return arr.reduce((r, e, i, a) => {
const res = sum(a.slice(i, a.length));
return r.concat(!a[i + 1] ? [res, 0] : res)
}, [])
}

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]));``````
Score: 1

You could iterate from the end and take 4 this value plus the last inserted value 3 of the result set.

This approach works with 2 a single loop and without calculating the 1 maximum sum in advance.

``````function partsSums(ls) {
var result = [0],
i = ls.length;

while (i--) {
result.unshift(ls[i] + result[0]);
}
return result;
}

console.log(partsSums([0, 1, 3, 6, 10]));
console.log(partsSums([]));``````
``.as-console-wrapper { max-height: 100% !important; top: 0; }``

With `push` and `reverse`.

``````function partsSums(ls) {
var result = [0],
l = 0,
i = ls.length;

while (i--) result.push(l += ls[i]);
return result.reverse();
}

console.log(partsSums([0, 1, 3, 6, 10]));
console.log(partsSums([]));``````
``.as-console-wrapper { max-height: 100% !important; top: 0; }``
Score: 1

try this with recursion :

``````function partsSums(ls) {
let sum = ls.reduce((a, b) => a + b, 0);
return  ls.length > 0 ? [sum].concat(partsSums(ls.slice(1))) : [0];
}

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]));``````

0

Score: 1

Here's one thing you could do

``````function partsSums(ls) {
if(!ls.length) return [0];
let prevTotal = ls.reduce((a,b) => a + b);
return [prevTotal, ...ls.map(val => prevTotal -= val)]
}

console.log(partsSums([0, 1, 3, 6, 10]));``````

0

More Related questions