算法问题-减少所需的方法解决方案

时间:2019-10-15 23:00:32

标签: javascript algorithm

我刚刚编写了一种算法,该算法将执行以下操作:

  1. 给出一个数组,即[1,5];
  2. 该函数将显示数组中数字之间的数字;
  3. 该函数将同时添加这两个数字以及它们之间的所有数字。

问题:

我觉得这个解决方案没有我想要的那么完美。我一直在尝试使用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].```

2 个答案:

答案 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);
}

但是不清楚您在做什么,所以我不会。