我刚刚编写了一种算法,该算法将执行以下操作:
[1,5]
; 问题:
我觉得这个解决方案没有我想要的那么完美。我一直在尝试使用reduce以某种方式控制索引参数来替换for
语句,但没有成功。我想要一些如何做的帮助。
var sumAll = (arr) => {
let max = Math.max(...arr);
let min = Math.min(...arr);
let newArr = [];
for (var i = min; i <= max; i++) { newArr.push(min++) }
return newArr.reduce(function(a,b) {return a+b})
}
console.log(sumAll(arr))
// return 15, that is the sum of the numbers in newArr [1, 2, 3, 4, 5].```
答案 0 :(得分:1)
如果您的目标只是找到两个数字之间的和,则可以使用公式:(max * (max+1) - (min) * (min-1))/2
。但这并不能完全解决如何使用函数操作来解决此问题的问题。
var sumBetweenSpanningRange = (arr) => {
let max = Math.max(...arr);
let min = Math.min(...arr);
return (max * (max + 1) - min * (min -1)) / 2
}
console.log(sumBetweenSpanningRange([1,1,3,5]))
答案 1 :(得分:1)
我认为它有些粗糙,但不是很多。您说要用for
替换reduce
循环。但是为什么不走另一条路,而用reduce
循环替换for
方法:
function sumAll (arr) {
let min = Math.min(...arr);
let max = Math.max(...arr);
let result = 0;
for (var i = min; i <= max; i++)
result += i;
return result;
}
这是假设您希望[1,1,2]
的总和为3,而不是4。如果您期望为4,那么您会遇到除抛光以外的其他问题。
如果您绝对必须将for
替换为reduce
,则可以执行以下操作:
function sumAll (arr) {
let min = Math.min(...arr);
let max = Math.max(...arr);
return [...Array(max - min + 1).keys()]
.map((_,i) => i + min)
.reduce((a,b) => a + b);
}
但是不清楚您在做什么,所以我不会。