return 对一个范围内的所有数字求和
return sum all numbers in a range
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 列表中。我尝试在两者之间使用 .sort()
方法,以便对数字进行排序但无法使其正常工作。我怎样才能使用 Math.min()
和 Math.max()
使此代码起作用?
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;
}
您可以将数组应用于 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
最简单的方法是使用数学公式
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;
}
其他人使用 arr[0] < arr[0] ? arr[0] : arr[1]
发布了代码; IMO Math.min
和 Math.max
函数比 ? : 运算符。
此外,还有两分钱:我相信根本不制作 var list
会更简单;而是说 var total = 0
并增加它。像这样:
function sumAll(arr) {
var lower = Math.min(arr[0], arr[1]);
var upper = Math.max(arr[0], arr[1]);
var total = 0;
for (var i = lower; i <= upper; i++) {
total += i;
}
return total;
}
.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])
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 代码:
<!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>
这是数学方程派上用场的时代之一。查看此代码:
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);
}
很简单的逻辑,对吧? :)
这是一种方法:
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;
});
}
我就是这样滚的
function sumAll(arr) {
return (arr[0]+arr[1])*(Math.max(...arr)-Math.min(...arr)+1)/2;;
}
我会简单一点:
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]);
我更喜欢简单....
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]);
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);
}
console.log( sumAll([1, 4]) )
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,但思路是一样的。
在α和β之间,有β−α+1个数。我们需要
S=α+(α+1)+⋯+β=β+(β−1)+⋯+α
垂直相加,我们有
2S=(β−α+1)(α+β)
因此
S=(β−α+1)(α+β)2
这项 "reverse and add" 技术源于高斯,也可用于对任何算术级数求和。
function sumAll(arr) {
let alpha = Math.min(...arr);
let beta= Math.max(...arr);
return ((beta - alpha + 1)*(alpha + beta))/2;
}
这个怎么样?遵循高斯公式:
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
像这样的 O(1) 方法可能是最好的方法:
function SumRange(a, b) {
if (a > b) {
return 0;
}
const sum = (b * ++b) / 2;
return a > 1 ? sum - SumRange(0, --a) : sum;
}
var array = [1, 100];
console.log(SumRange(array[0], array[1]));//5050
console.log(SumRange(10, 100));//5005
我们的想法是孤立 SumRange 方程,这样它就可以成为可以从任何地方调用的唯一真实来源。可重用性总是一个优势。
加上 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]);
使用 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];
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 列表中。我尝试在两者之间使用 .sort()
方法,以便对数字进行排序但无法使其正常工作。我怎样才能使用 Math.min()
和 Math.max()
使此代码起作用?
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;
}
您可以将数组应用于 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
最简单的方法是使用数学公式
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;
}
其他人使用 arr[0] < arr[0] ? arr[0] : arr[1]
发布了代码; IMO Math.min
和 Math.max
函数比 ? : 运算符。
此外,还有两分钱:我相信根本不制作 var list
会更简单;而是说 var total = 0
并增加它。像这样:
function sumAll(arr) {
var lower = Math.min(arr[0], arr[1]);
var upper = Math.max(arr[0], arr[1]);
var total = 0;
for (var i = lower; i <= upper; i++) {
total += i;
}
return total;
}
.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])
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 代码:
<!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>
这是数学方程派上用场的时代之一。查看此代码:
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);
}
很简单的逻辑,对吧? :)
这是一种方法:
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;
});
}
我就是这样滚的
function sumAll(arr) {
return (arr[0]+arr[1])*(Math.max(...arr)-Math.min(...arr)+1)/2;;
}
我会简单一点:
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]);
我更喜欢简单....
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]);
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);
}
console.log( sumAll([1, 4]) )
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,但思路是一样的。
在α和β之间,有β−α+1个数。我们需要
S=α+(α+1)+⋯+β=β+(β−1)+⋯+α
垂直相加,我们有
2S=(β−α+1)(α+β)
因此
S=(β−α+1)(α+β)2
这项 "reverse and add" 技术源于高斯,也可用于对任何算术级数求和。
function sumAll(arr) {
let alpha = Math.min(...arr);
let beta= Math.max(...arr);
return ((beta - alpha + 1)*(alpha + beta))/2;
}
这个怎么样?遵循高斯公式:
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
像这样的 O(1) 方法可能是最好的方法:
function SumRange(a, b) {
if (a > b) {
return 0;
}
const sum = (b * ++b) / 2;
return a > 1 ? sum - SumRange(0, --a) : sum;
}
var array = [1, 100];
console.log(SumRange(array[0], array[1]));//5050
console.log(SumRange(10, 100));//5005
我们的想法是孤立 SumRange 方程,这样它就可以成为可以从任何地方调用的唯一真实来源。可重用性总是一个优势。
加上 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]);
使用 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];