使用for循环修改功能以提高效率

时间:2018-07-09 17:29:15

标签: javascript

我正在创建一个从数组参数返回唯一整数的函数。我编写了一个可以正常工作的函数,但是它太慢了。该功能通过所有逻辑测试,但超时。

函数接受这样的参数:

[9,2,1,2,1,6,1,1,6,2,8,1,8]

我的功能:

function findUnique(numbers) {

        let unqNumber, matchCount,i,y;
        let len = numbers.length;

        for (i = 0; i < len; i++  ) {
                matchCount = 0;
                for (y = 0; y < len; y++ ) {
                        if (numbers[i] == numbers[y]) {
                                matchCount++;                           
                        }               
                }
                if (matchCount == 1) {
                        unqNumber = numbers[i]
                }
        }
        return unqNumber;
}

它将每个索引与所有其他索引进行比较,并对出现的次数进行计数。只有1次出现的索引是唯一编号。

传入的数组中始终只有一个唯一编号。

我知道for循环效率低下,但我不知道另一种编写方式。我可以使用filter()或map()更快,更有效地完成此任务吗?

2 个答案:

答案 0 :(得分:1)

使用哈希图。您代码的当前复杂度为O(n * n)。使用哈希图,它将为O(n)。

例如)

var temp = [9,2,1,2,1,6,1,1,6,2,8,1,8];

function findUnique(numbers) 
{
    let unqNumber,i;
    let len = numbers.length;

    var mymap = {};
    for(i = 0; i < len; i++)
    {
        if(numbers[i] in mymap)
        {
            mymap[numbers[i]]++;
        }
        else
        {
            mymap[numbers[i]] = 1;
        }
    }
    console.log(mymap);
    //{1: 5, 2: 3, 6: 2, 8: 2, 9: 1}
    for(var j in mymap) 
    {
        if(mymap[j] == 1)
        {
            unqNumber = j;
        }
    }
    return unqNumber;
}

console.log(findUnique(temp));
//9

答案 1 :(得分:0)

在这里,您可以跟踪唯一身份信息和多次出现的数字:

input = [9,2,1,2,1,6,1,1,6,2,8,1,8];

function getUniques(array) {
  doubles = [];
  uniques = [];
  for (var i = 0; i < array.length; i++) {
    if(doubles.indexOf(array[i]) != -1) {
      continue;
    } else if(uniques.indexOf(array[i]) == -1) {
      uniques.push(array[i]);
    } else {
      doubles.push(uniques.splice(uniques.indexOf(array[i]),1)[0]);
    }
  }
  return uniques;
}
  

console.log(getUniques(input)[0]);

您可以尝试类似的方法。您获得每个元素并将其视为唯一元素,或者从数组中删除所有相同的项目,直到找到唯一的元素为止。 如果有多个唯一项目,则返回第一个。

input = [9,2,1,2,1,6,1,1,6,2,8,1,8];

function findFirstUnique(array) {
  while(array.length > 0) {
    i = array.splice(0,1)[0];
    next = array.indexOf(i);
    if(next == -1) {
      return i;
    }
    while(next != -1) {
      array.splice(next,1);
      next = array.indexOf(i);
    }
  }
}

console.log(findFirstUnique(input))