【问题标题】:Sum All Numbers in a Range对范围内的所有数字求和
【发布时间】:2021-10-03 19:46:24
【问题描述】:

freecodecamp 算法挑战。我无法确定我在函数中的哪个点返回了多个值。正确的返回值应该是 10。我在这个函数中打印出的 console.log 显示了三个值,中间的一个是正确的。如何定位这个特定值并忽略其他值? https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/sum-all-numbers-in-a-range

function sumAll(arr) {
    for (let i = 0; i < arr.length; i++){
      if (arr[i] != arr[arr.length -1]){
        let num = arr[i] + 1;
        arr.splice(arr[i], 0, num);
          console.log(arr.reduce(function(sum, value) {
            return sum + value;
          }, 0));
      }
    }
}

sumAll([1, 4]);

【问题讨论】:

    标签: javascript


    【解决方案1】:

    你可以像这样使用递归:

    function sumAll(arr) {
      arr.sort((a, b) => a - b);
      return arr[0] == arr[1] ? arr[0] : arr[0] + sumAll([arr[0] + 1, arr[1]])
    }
    console.log(sumAll([1, 4]));

    【讨论】:

      【解决方案2】:

      您无需采取更艰难的方式。首先,您可以使用简单的 for 循环和排序,其次您可以使用我更喜欢的递归,因为您只需要一行代码。这是我的答案=>

      /*function sumAll(arr) {
        arr.sort((a, b) => a - b);
        let sum = 0;
        for (let i = arr[0]; i <= arr[1]; i++) {
          sum += i;
        }
        return sum;
      }
      
      console.log(sumAll([1, 4]));*/
      
      
      function sumAll(arr) {
        arr.sort((a, b) => a - b);
        return arr[0] == arr[1] ? arr[0] : arr[0] + sumAll([arr[0] + 1, arr[1]])
      }
      console.log(sumAll([1, 4]));

      【讨论】:

        【解决方案3】:

        主要问题似乎出在arr.splice(arr[i], 0, num); 这一行。不建议更改当前正在迭代的数组的长度。

        function sumAll(arr) {
          let num = [];
          let x = arr[0];
          while (x <= arr[1]) {
            num.push(x);
            x++;
          }
          return num.reduce((acc, curr) => {
            return acc += curr
        
          }, 0)
        }
        
        console.log(sumAll([1, 4]));

        【讨论】:

          【解决方案4】:

          如果你提取一个范围效用函数,你可以更容易地做到这一点。没有冲动

          const range = (a,b) => Array(Math.abs(a-b)+1).fill(0).map((_,i) => i+Math.min(a,b))
          const sumAll = ([a,b]) => range(a,b).reduce((c,d) => c+d,0)
          

          要准确诊断代码有什么问题,一个好的开始是它没有返回任何内容,它是 console.logging,所以如果你将 console.log 替换为 return

          【讨论】:

          • 这太棒了。是的,console.log() 而不是 return 就是为什么运行它会在控制台上返回一个额外的 undefined。我差点错过了。
          猜你喜欢
          • 2016-10-15
          • 2019-05-14
          • 2015-07-28
          • 2021-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-19
          • 1970-01-01
          相关资源
          最近更新 更多