繁体   English   中英

循环运行速度不够快的JavaScript函数

[英]JavaScript function with loops not running fast enough

我正在尝试练习面试,并在网上发现了一个挑战来编写一个函数,该函数将获取一组数字,并且只返回在数组中只存在一次的值,并按顺序返回这些值。 例如,数组[1,3,5,6,1,4,3,6]应返回[4,5]。

我有一个通过测试的脚本,但是有些测试运行得太慢了。 我错了吗? 是否有一些基本方法可以加快速度? 该脚本以findTheNumbers开头,a是数组输入:

function findTheNumbers(a) {
    var retVal = [];
    var nonUnique = [];

    for (var i = 0; i < a.length; i++){
        var isUnique = true;
        if (i != 0){
            for (var j = 0; j < nonUnique.length; j++){
                if (a[i] == nonUnique[j]){
                    isUnique = false;
                    break;
                }
            }
        }

        if (isUnique){
            for (var k = 0; k < a.length; k++){
                if (a[i] == a[k] && i != k){
                    isUnique = false;
                    nonUnique.push(a[i]);
                    break;
                }
            }    
        }

        if (isUnique){
            retVal.push(a[i]);
            if (retVal.length == 2){
                break;
            }
        }


    }

    retVal = sortArrayOfLengthOfTwo(retVal);
    return retVal;
}

function sortArrayOfLengthOfTwo(array){
    var retVal = [];
    if (array[0] > array[1]){
        retVal.push(array[1]);
        retVal.push(array[0]);
    } else {
        retVal = array;
    }

    return retVal;
}

更新 -

不知道最好的地方在哪里,但这是我的新版本基于接受的答案的提示(其工作速度更快):

function findTheNumbers(a) {
    var retVal = [];
    var dict = {};
    for (var i = 0; i < a.length; i++){
        dict[a[i]] = 1 + (dict[a[i]] || 0);
    }

    for (var key in dict){
        if (dict[key] == 1){
            retVal.push(parseInt(key));
        }
    }

    return retVal;
}

当程序太慢时,经验法则是

  • 首先归咎于你的算法
  • 接下来责怪你的实现( 编辑:按照Bergi的建议
  • 最后责备语言

在您的情况下,您解析整个数组n次,即复杂度为o(n ^ 2)。 只需一个完整的解析,并且每个元素的计数字典都可以执行相同的操作。

编辑您的新算法

你的新算法非常好。 为了你的采访,我有一些意见:

  • 而不是var ,你应该考虑使用const尽可能多的,和let否则
  • 不要犹豫,将中间结果放在变量中
  • 为变量使用更具描述性的名称

这是我实现它的方式:

function findTheUniqueNumbers(a) {
  const numberCounts = {} // I prefer "new Map()" on recent env.
  a.forEach( function(e) {
    const previousCount = numberCounts[e] || 0
    numberCounts[e] = previousCount + 1
  } )

  return Object.keys(numberCounts)
    .filter( function(e) {
      return numberCounts[e] === 1
    } )
}


const uniqueNumber = findTheUniqueNumbers([1, 3, 5, 6, 1, 4, 3, 6])
console.log(uniqueNumber)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM