如何在JavaScript中使用此函数对一个范围内的所有数字求和?
我正在完成这项编码挑战 他们建议使用Math.max、Math.min、Array.reduce,但是我开始研究一个解决方案,该解决方案没有使用这些方法中的任何一种,但很快发现可能我应该使用,因为我的版本开始显得有点笨拙如何在JavaScript中使用此函数对一个范围内的所有数字求和?,javascript,arrays,sorting,Javascript,Arrays,Sorting,我正在完成这项编码挑战 他们建议使用Math.max、Math.min、Array.reduce,但是我开始研究一个解决方案,该解决方案没有使用这些方法中的任何一种,但很快发现可能我应该使用,因为我的版本开始显得有点笨拙 function sumAll(arr){ var index0 = arr[0], index1 = arr[1], counter = 0, sum = 0, val; if(index0 < index1){ counter +=
function sumAll(arr){
var index0 = arr[0], index1 = arr[1], counter = 0, sum = 0, val;
if(index0 < index1){
counter += index0;
while(counter <= index1){
val = index0++;
sum += val;
counter++;
}
} else if(index0 > index1){
counter = 1;
counter += index0;
while(counter >= index1){
val = index1 + 1;
sum += val;
counter--;
}
}
return sum;
}
因此,我的两个问题如下:
它变得笨重了,我说得对吗?
我应该使用上述推荐的方法吗?
我想当我有事情要做的时候,我会很兴奋,但现在我觉得我正因为另一种潜在的情况而陷入困境
提前谢谢 可以使用最小值、最大值和一个循环
var sumAll=功能RR{
var总和=0,
最小值=Math.min.applynull,arr,
max=Math.max.applynull,arr;
对于var i=min;i可以使用min、max和一个循环
var sumAll=功能RR{
var总和=0,
最小值=Math.min.applynull,arr,
max=Math.max.applynull,arr;
对于var i=min;i这里有一个更快的版本,它利用了这样一个事实,即您不必实际将序列中的每个序列号相加,但您可以根据起点和终点计算总和:
function sumAll(args) {
var min = Math.min.apply(Math, args),
max = Math.max.apply(Math, args);
return min + ((max - min) * ((max + min + 1) / 2));
}
还有,这里有一个测试台:它将其与老式的精确性方法进行比较
为了实现纯粹的性能而不是代码的简洁性,最好只比较两个值,而不是进行两次函数调用:
function sumAllFaster(args) {
var min, max;
if (args[0] < args[1]) {
min = args[0];
max = args[1];
} else {
min = args[1];
max = args[0];
}
return min + ((max - min) * ((max + min + 1) / 2));
}
如果您针对@NenadVracar答案进行测试,并包括一些大范围,则最后一个版本的速度会快100倍。范围越长,速度差异越大。即使在短范围内,速度也会快3-4倍。此处的定时测试:
这里有一个稍微快一点的版本:
function sumAllFastest(args) {
var diff = args[0] < args[1] ? args[1] - args[0] : args[0] - args[1];
return (1 + diff) * ((args[0] + args[1]) / 2)
}
这是一个稍微快一点的版本,它利用了一个事实,即您不必实际添加序列中的每个序列号,但您可以根据起点和终点计算该和:
function sumAll(args) {
var min = Math.min.apply(Math, args),
max = Math.max.apply(Math, args);
return min + ((max - min) * ((max + min + 1) / 2));
}
还有,这里有一个测试台:它将其与老式的精确性方法进行比较
为了实现纯粹的性能而不是代码的简洁性,最好只比较两个值,而不是进行两次函数调用:
function sumAllFaster(args) {
var min, max;
if (args[0] < args[1]) {
min = args[0];
max = args[1];
} else {
min = args[1];
max = args[0];
}
return min + ((max - min) * ((max + min + 1) / 2));
}
如果您针对@NenadVracar答案进行测试,并包括一些大范围,则最后一个版本的速度会快100倍。范围越长,速度差异越大。即使在短范围内,速度也会快3-4倍。此处的定时测试:
这里有一个稍微快一点的版本:
function sumAllFastest(args) {
var diff = args[0] < args[1] ? args[1] - args[0] : args[0] - args[1];
return (1 + diff) * ((args[0] + args[1]) / 2)
}
这里有一个稍微慢一点的版本,但它在ES6中,这很酷
function sumAll(arr, n=1){
const [min, max] = arr.sort();
return Array(max+n).fill(0,min-n,max+n).reduce((a,b,i) => a+i);
}
这里有一个稍微慢一点的版本,但它在ES6中,这很酷
function sumAll(arr, n=1){
const [min, max] = arr.sort();
return Array(max+n).fill(0,min-n,max+n).reduce((a,b,i) => a+i);
}
解决这一问题的直观方法是: 查找输入数组的最小值和最大值。 从最小值到最大值对所有数字求和。 大概是这样的:
sumAll = function(arr) {
var low_bound = Math.min.apply(Math, arr);
var up_bound = Math.max.apply(Math, arr);
result = 0;
for (i=low_bound;i<=up_bound;i++){
result += i;
}
return result
}解决这个问题的直观方法是: 查找输入数组的最小值和最大值。 从最小值到最大值对所有数字求和。 大概是这样的:
sumAll = function(arr) {
var low_bound = Math.min.apply(Math, arr);
var up_bound = Math.max.apply(Math, arr);
result = 0;
for (i=low_bound;i<=up_bound;i++){
result += i;
}
return result
}我很确定,当他说:一个数字数组时,他/她不是指一个包含这两个数字的数组对象。所以我给你这个斯巴达JS:
function sum_range(x,y){ return( 1 + ( x < y ? y - x : x - y ) ) * (x + y) / 2; }
v、 s:
我很确定,当说:一个数字数组时,他/她并不是指一个包含这两个数字的数组对象。所以我给你这个斯巴达JS:
function sum_range(x,y){ return( 1 + ( x < y ? y - x : x - y ) ) * (x + y) / 2; }
v、 s:
谢谢Nenad,我喜欢你的解决方案非常简单!更少的代码;谢谢Nenad,我喜欢你的解决方案非常简单!更少的代码;只是好奇。为什么创建数组只是为了求顺序值的和很酷?@jfriend00-因为。。。这是ES6@Пааааааааааааааа。为什么创建数组只是为了求顺序值的和很酷?@jfriend00-因为。。。它是ES6@МаааааПааааааааааааааа。但无论你做什么,我的都是最快的。添加了一些关于各种选项性能测试的注释。不,你刚刚偷了我的纯数学三元并将其添加到你的收藏中。但无论你做什么,我的都是最快的。问题明确地说:我们将传递给你一个由两个数字组成的数组。再清楚不过了。对于每两个或两个以上的数字;项目;就性能而言,我的斯巴达人仍然比你的最快速度快约25%,即使我不得不削弱它以适应你为单参数数组输入所做的测试算法,如:函数sum_rangex{return 1+x[0]