数组中的第一个UNIQUE编号。需要优雅的解决方

时间:2015-07-15 17:42:26

标签: javascript

Hy Guys。我被要求创建一个函数,从给定的整数数组返回第一个UNIQUE整数。在成功的情况下,函数在失败返回-1的情况下返回唯一编号。复杂度应为O(N * log(N)) 我的解决方案是:

function solution(A) {

    var returnNumber = -1;
    var tempArray = new Array();;

   for(i=0; i < A.length; i++){

      var newIndex = A[i];
     if( tempArray[newIndex] === undefined){
        tempArray[newIndex] = 1;
     }
     else{
        tempArray[newIndex] += 1;
     }
    }
   for(j = 0; j < A.length; j++){
     if(tempArray[A[j]] == 1){
       returnNumber = A[j];
       break;
     }
   }
    return returnNumber;
}

//var A =  [1, 4, 3, 3, 1, 2, 0, 0]; //returns 4
var A =  [22, 25, 3, 3, 1, 2, 0, 0,100,22,25,1,2]; // returns 100
solution(A)

有人可以创造更优雅的解决方案吗?欢迎提出任何意见。

2 个答案:

答案 0 :(得分:2)

[编辑] 怎么样:

// checks for duplictes before and after current node
function find1 (ls) {
    return ls.find(function (n, idx, ls) {
        return (idx == ls.indexOf(n)) && (-1 == ls.indexOf(n, idx + 1));
    });
}

对我来说看起来很优雅,并且表现相同。

答案 1 :(得分:1)

1)复制阵列(O(N))

2)编写快速排序对副本进行排序(O(N * log(N))),然后:

3)搜索第一个唯一的:

  • 循环非排序数组
  • 为每个元素使用二进制搜索算法(O(log(N)))在排序数组中找到它的位置
  • 只需检查下一个元素是否也具有相同的值O(1) 当您找到第一个没有重复的内容时,请停止。

这3个点使O(N *(log(N)+1))简单地为(O(N * log(N)))。

所以最后你得到O(N)+ 2 *(O(N log(N))),这又是(O(N log(N)))。