javascript - 如何在 JavaScript 中使用此函数对一个范围内的所有数字求和?

标签 javascript arrays sorting

我正在 Free Code Camp 上完成这个编码挑战

We'll pass you an array of two numbers. 
Return the sum of those two numbers and all numbers between them. 
The lowest number will not always come first.

他们建议使用 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 += 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;
}

基本上这可以工作,除非您尝试:

sumAll([10, 5]) //I get 42, rather than 45

所以我的两个问题如下:

我说的对吗,它越来越笨重了? 我应该使用上述推荐的方法吗? 我想当我让事情开始工作时我只是很兴奋,但现在我觉得我正在陷入另一个潜在状况的兔子洞..

提前致谢!

最佳答案

这里有一个更快的版本,它利用了这样一个事实,即您不必实际添加序列中的每个序列号,但您可以根据起点和终点计算该总和:

function sumAll(args) {
    var min = Math.min.apply(Math, args),
        max = Math.max.apply(Math, args);
  return min + ((max - min) * ((max + min + 1) / 2));
}

还有,这是一个测试台:https://jsfiddle.net/jfriend00/rh75gesc/将其与老式的准确性方法进行比较。


为了纯粹的性能(而不是代码简洁),最好只比较两个值而不是调用两个函数:

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 倍。计时测试在这里:https://jsfiddle.net/jfriend00/5daztnky/ .

这是一个稍快的版本:

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)
}

关于javascript - 如何在 JavaScript 中使用此函数对一个范围内的所有数字求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36973248/

相关文章:

javascript - 在 javascript/jquery 中根据 div 类型从低到高对 div 数组进行排序

linux - 为什么使用管道进行排序(linux 命令)很慢?

javascript - onmousedown/onmouseup 功能不起作用

javascript - 我可以在加载整个页面之前运行 javascript 吗?

java - 在 GWT 应用程序中捕获 ctrl-z(撤消)和 ctrl-y(重做)

PHP foreach 和引用资料

java - 如何使用二进制数技术对整数的数字进行排序?

javascript - CSS3 transform + jQuery 翻转卡问题

javascript - 如何根据Javascript中的嵌套值过滤数组

java - 初始化数组列表的简洁方法