返回

时间:2015-05-04 17:28:24

标签: javascript sorting reduce

function sumAll(arr) {
    var list = [];

    for (var i = arr[0]; i <= arr[1]; i++) {
        list.push(i);
    }

    var total = list.reduce(function(a, b) {
        return a + b;

    });

    return total;
}

sumAll([10, 5]);
//sumAll([1, 4]);  //returns 10
//sumAll([5, 10]); //returns 45
//sumAll([4, 1]);

我需要对给定参数之间的每个数字求和。适用于sumAll([1, 4])sumAll([5, 10])。代码将通过,因为它会在两个参数之间创建所有数字并添加它。但是,对于sumAll([10, 5])sumAll([4, 1]),因为数字越大是第一个参数,我相信它不会运行var list。我尝试在其间使用.sort()方法,以便对数字进行排序但无法使其工作。如何使用Math.min()Math.max()来使用此代码?

17 个答案:

答案 0 :(得分:5)

最简单的方法是使用数学公式

return set(subclass.__subclasses__() for subclass in self.__subclasses__())

这里你想要总和,

1+2+...+n = n(n+1)/2

其中m+(m+1)+...+n m=arr[0]。这等于差异

n=arr[1]
用上述公式代替两次的

等于

(1+2+...+n) - (1+2+...+(m-1))

所以正确的代码是

n(n+1)/2 - (m-1)m/2

原始答案(不要使用 - 留给子孙后代):

以下是我如何使用function sumAll(arr) { var min = arr[0]; var max = arr[1]; return (max*(max+1) - (min-1)*min)) / 2; } Math.min执行此操作的方法:

Math.max

其他人使用function sumAll(arr) { var list = []; var lower = Math.min(arr[0], arr[1]); var upper = Math.max(arr[0], arr[1]); for (var i = lower; i <= upper; i++) { list.push(i); } var total = list.reduce(function(a, b) { return a + b; }); return total; } 发布了代码; IMO arr[0] < arr[0] ? arr[0] : arr[1]Math.min函数的代码比? :运营商。

另外,还有两美分:我认为根本不做Math.max会更简单;而是说var list并增加它。像这样:

var total = 0

答案 1 :(得分:5)

这是数学方程派上用场的时代之一。看看这段代码:

function sumAll(arr) {
max=Math.max(arr[0],arr[1]);
min=Math.min(arr[0],arr[1]);
return (max*(max+1)/2)-((min-1)*min/2);
}

非常简单的逻辑,对吧? :)

答案 2 :(得分:1)

&#13;
&#13;
function sumAll(arr) {

    var first = arr[0] > arr[1] ? arr[1] : arr[0],
        last = arr[0] > arr[1] ? arr[0] : arr[1];
        sum = 0;
    for (var i = first; i <= last; i++) {
        sum += i;
    }
    return sum;
}
&#13;
&#13;
&#13;

答案 3 :(得分:1)

使用while循环:

function sumAll(arr) {
    var i = Math.min(...arr)
    var total = 0
    while(i <= Math.max(...arr)) {
        total += i
        i++
    }

    return total;
}
sumAll([1, 4];

答案 4 :(得分:1)

添加了ES6

function sumAll(arr) {
   const min = Math.min(...arr)
   const max = Math.max(...arr)
   let list = [] 
   for(let i = min;i <= max; i++){
      list.push(i)
   }

   return list.reduce((prev, next) => prev + next);
}

sumAll([1, 4]);

答案 5 :(得分:1)

function sumAll(arr) {
  var max = Math.max.apply(null, arr);
  var min = Math.min.apply(null, arr);
  var arr2 = [];

  for (var i=min; i<=max; i++)
  {
    arr2.push(i);
  }

  return arr2.reduce(function(sum, item){sum+=item; return sum;},0);
}

sumAll([1, 4]);

答案 6 :(得分:0)

您可以将数组应用于Math.minMath.max函数。

function sumAll(arr) {
  var list = [];

  for (var i = Math.min.apply(null, arr); i <= Math.max.apply(null, arr); i++) {
    list.push(i);
  }

  var total = list.reduce(function(a, b) {
    return a + b;
  }, 0);

  return total;
}

[[10, 5], [1, 4], [5, 10], [4, 1]].forEach(function(range) {
  console.log(range.join(' -> ') + ' = ' + sumAll(range));
});

输出:

10 -> 5 = 45
1 -> 4 = 10
5 -> 10 = 45
4 -> 1 = 10

答案 7 :(得分:0)

类似O(1)的方法可能是最好的方法:

ExtendedService

这个想法是孤立SumRange方程,这样它就可以成为可以在任何地方调用的唯一事实来源。可重用性总是一个优点。

答案 8 :(得分:0)

这个呢?遵循高斯公式:

function sumAll(arr) {
    return arr.reduce((a,b) => (a+b)*(Math.abs(a-b) + 1) / 2)
}

console.log(sumAll([1,4])); //10
console.log(sumAll([5,10])); //45
console.log(sumAll([10,5])); //45

答案 9 :(得分:0)

在α和β之间,存在β-α+ 1数。我们需要

S=α+(α+1)+⋯+β=β+(β−1)+⋯+α

垂直添加,我们有

2S=(β−α+1)(α+β)

因此

S=(β−α+1)(α+β)2

这种“反向加法”技术归因于高斯,也可以用于求和任何算术级数。

function sumAll(arr) {
  let alpha = Math.min(...arr);
  let beta= Math.max(...arr); 
  return ((beta - alpha + 1)*(alpha + beta))/2;      
}

答案 10 :(得分:0)

function sumAll(arr) {
  const rangeStart = Math.min(arr[0], arr[1]);
  const rangeEnd = Math.max(arr[0], arr[1]);
  const numberOfDigits = rangeEnd - rangeStart + 1;

  return (rangeEnd + rangeStart) * numberOfDigits / 2;
}

有点: https://betterexplained.com/articles/techniques-for-adding-the-numbers-1-to-100/

但并非总是从1开始,而是从“ rangeStart”开始,numberOfDigits并不总是rangeEnd,但是想法是相同的。

答案 11 :(得分:0)

这就是我滚动的方式

function sumAll(arr) {
return (arr[0]+arr[1])*(Math.max(...arr)-Math.min(...arr)+1)/2;;
}

答案 12 :(得分:0)

这是一种方法:

function sumAll(arr) {
  var sortedArray = arr.sort(function(a,b) { 
    return a-b;
  });

  return sortedArray.reduce(function(a, b, start, arr) {
    var temp = a, subTotal = a;
    while (temp < b - 1) {
      subTotal += ++temp;
    }

    return subTotal + b;
  });
}

答案 13 :(得分:0)

Javascript代码:

function myFunction(arr) {
  console.log(arr);
  var list = [];

  var startVal = arr[0];
  console.log(startVal);
  var stopVal = arr[1];
  console.log(stopVal);

  while(startVal < stopVal+1){
    list.push(startVal++);
  }
      console.log(list);

      var total = list.reduce(function(a, b) {
          return a + b;

      });

     // return total;
      document.getElementById("demo").innerHTML = total;
  }

HTML CODE:

<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
  <script src="app2.js"></script>
</head>
<body>
  <button onclick="myFunction([5,10])">Try it</button>
  <div id="demo"></div>
</body>
</html>

答案 14 :(得分:0)

.sort()按字符串对数组进行排序,使用 compareFunction 按数字值排序:

arr.sort(function(a, b) {
  return a - b;
});

如果要使用min或max,则将数组作为参数传递:

1)Math.max.apply(this, arr); || Math.min.apply(this, arr);

2)Math.max(arr[0], arr[1]) || Math.min(arr[0], arr[1])

答案 15 :(得分:-1)

我更喜欢简单......

function sumAll(arr) {
 var max = Math.max.apply(null, arr);
 var min = Math.min.apply(null, arr);
 var sum = 0;
 for(var i = min; i <= max; i++)
 sum = sum + i;
 return sum;
}
sumAll([1, 4]);

答案 16 :(得分:-1)

我会很简单:

function sumAll(arr) {

  var sum = 0;

  arr.sort(function(a, b) {
    return a - b;
  });

  for (var i = arr[0]; i <= arr[arr.length - 1]; i++) {
   sum += i;
  }

  return sum;

}

sumAll([4, 1]);