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()
来使用此代码?
答案 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)
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;
答案 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.min
和Math.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]);