Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组中的第一个唯一编号。需要优雅的解决方案_Javascript - Fatal编程技术网

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

Javascript 数组中的第一个唯一编号。需要优雅的解决方案,javascript,Javascript,嗨,伙计们。我被要求创建一个函数,从给定的整数数组返回第一个唯一的整数。如果成功,函数将返回唯一的数字;如果失败,函数将返回-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(

嗨,伙计们。我被要求创建一个函数,从给定的整数数组返回第一个唯一的整数。如果成功,函数将返回唯一的数字;如果失败,函数将返回-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)
函数解决方案(A){
var returnNumber=-1;
var tempArray=新数组();;
对于(i=0;i
有人能创造出更优雅的解决方案吗?欢迎发表任何意见。

1)复制数组(O(N))

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

3) 通过以下方式搜索第一个唯一项:

  • 非排序数组上的循环
  • 对于每个元素,使用二进制搜索算法(O(log(N))查找其在排序数组中的位置
  • 只需检查下一个元素是否也具有相同的值O(1) 当您找到第一个未复制的时,请停止
这三点构成O(N*(log(N)+1)),简单地说就是(O(N*log(N)))

最后得到O(N)+2*(O(Nlog(N)),它又是(O(Nlog(N))。

[EDIT] 那么:

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

在我看来,它看起来足够优雅,而且性能也相当不错。

这可能更适合于。这个函数实际上是
O(n)
…如果我不是在做梦,几分钟前我看到了一位知名会员的回答!@volkinc说这不是O(N*log(N)),他反对。答案在哪里?一位有名望的议员这样简单地删除他的答案,是不能接受的。如果有人有他的名字,让我来投诉他的行为。他很有声望,所以他的投票可能会让其他人失望。他应该谦虚地接受自己的错误。你介意解释一下为什么这是一个答案吗?这将大大增加它的价值。答案应该是JSThis返回
3
,而不是
100
@innoSPG:最坏的情况,是的;最好的情况是O(N*log(N))@publicoverride,最好的情况是O(N),(比O(N*log(N))更好)当第一个唯一值位于位置1时,我们在现实生活中会遇到多少次这种情况?对于您的算法,在复杂性研究中使用的大多数时间的平均情况是O(N^2)。想想看。