【问题标题】:Optimising JavaScript for an exercise on Codewars优化 JavaScript 以进行 Codewars 练习
【发布时间】:2017-05-09 01:24:07
【问题描述】:

我目前通过在 Codewars.com 上做练习来研究我的 JavaScript。 我一直做得很好,但我遇到了这个问题,我无法找到优化它的方法。 问题来了:

对的总和

给定一个整数列表和一个总和值,按照出现的顺序返回前两个值(请从左边解析),加起来形成总和。

sum_pairs([0, 0, -2, 3], 2)
#  there are no pairs of values that can be added to produce 2.
== None/nil/undefined (Based on the language)

sum_pairs([10, 5, 2, 3, 7, 5],         10)
#              ^-----------^   5 + 5 = 10, indices: 1, 5
#                    ^--^      3 + 7 = 10, indices: 3, 4 *
#  * entire pair is earlier, and therefore is the correct answer
== [3, 7]

注意: 还将测试长度超过 10,000,000 个元素的列表。确保您的代码不会超时。


这很简单,我的解决方案有效,但在 10,000,000 个元素测试的 12 秒后超时。

我的解决方案:

function sum_pairs(numArray, num){
  var nums = numArray;
  var sum = num;
  var resultsArray = [];
  var result;

  for(var i = 0; i < nums.length; i++){
    for(var j = i+1; j < nums.length; j++){
      if(nums[i] + nums[j] == sum){
        resultsArray.push({resArray: [nums[i],nums[j]], weight: j});
      }
    }
  }

  if(resultsArray.length != 0){
  var result = resultsArray.pop();
    for(var i = 0; i < resultsArray.length; i++){
      if(result.weight > resultsArray[i].weight){
        result = resultsArray[i];
      }
    }
    result = result.resArray;
  }

  return result;

}

问题:

如何优化此代码使其不会超时。 我只是一个编程方面的初学者,我不确定我的解决方案的哪一部分会导致速度变慢。 我现在要阅读 Big O 表示法,还有其他学习代码优化的资源吗?

【问题讨论】:

标签: javascript performance optimization


【解决方案1】:

例如[a,b,c,d,e]

而不是采用a 并针对右侧进行测试 (b,c,d,e)

[a,b,c,d,e]
 i j j j j
   i j j j
     i j j
       i j

b 开始并针对左侧 (a) 进行测试

[a,b,c,d,e]
 j i
 j j i
 j j j i
 j j j j i

这样你找到的第一个匹配就是你想要的,你可以返回而不必遍历整个数组。

【讨论】:

  • 将解决方案更改为:function sum_pairs(numArray, num){ }
  • 对不起,我的格式关闭了,然后我的编辑时间用完了>function sum_pairs(numArray, num){ var nums = numArray; var sum = num; var resultsArray = []; for(var i = 0; i < nums.length; i++){ for(var j = 0; j < i; j++){ if(nums[i] + nums[j] == sum){ return [nums[j], nums[i]]; } } } } 仍然不够快! (还是)感谢你的建议。现在对这个问题很生气,但我真的很想解决它!
  • 非常新的堆栈溢出,与 cmets 中的格式作斗争。似乎处理方式非常不同...必须查找如何添加新行...
  • @user2831946 我不认为你可以在 cmets 中添加新行,太糟糕了,改变还不够:S
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 2020-09-02
相关资源
最近更新 更多