Java 在整数数组中查找第一个非重复数

Java 在整数数组中查找第一个非重复数,java,c++,algorithm,Java,C++,Algorithm,我有一道考试题: 给定一个整数数组,使用O(N)时间复杂度和O(1)空间复杂度查找数组中不重复的第一个数字 我想不出任何解决办法。我知道我可以迭代数组并维护一个linkedhashmap,它将存储数组元素和它出现的次数,最后我必须搜索hashmap来找到那个数字。空间复杂度大于O(1),但我想不出其他解决方案 我也仔细阅读了这个问题,并说阵列的最大大小将是100万。我认为,如果我们可以创建一个自定义hashmap,该hashmap将使用100万大小的固定大小数组,那么这可以在O(1)空间复杂度中

我有一道考试题:

给定一个整数数组,使用O(N)时间复杂度和O(1)空间复杂度查找数组中不重复的第一个数字

我想不出任何解决办法。我知道我可以迭代数组并维护一个linkedhashmap,它将存储数组元素和它出现的次数,最后我必须搜索hashmap来找到那个数字。空间复杂度大于O(1),但我想不出其他解决方案

我也仔细阅读了这个问题,并说阵列的最大大小将是100万。我认为,如果我们可以创建一个自定义hashmap,该hashmap将使用100万大小的固定大小数组,那么这可以在O(1)空间复杂度中实现,因为在这种情况下,所需的存储是恒定的,但如果我是正确的,则无法确定。如果还有其他解决方案,请告诉我

如果除一个元素外的所有元素都有两个(或2的倍数)条目,这将是非重复的,则可以使用XOR运算符

例如:

int x=arr[0];
for(i=1;i<1000;i++)
  x^=a[i];
printf("Non-repeating: %d",x);
intx=arr[0];

对于(i=1;i我认为解决问题的诀窍是:

阵列的最大大小为1百万

自:

O(1)空格表示算法所需的内存是常量

然后空间复杂度将自动变为O(1),给定常量1M。注意,1M仍然是一个常量,尽管它是一个非常大的数字。因此我们只需要关注时间复杂度

使用
LinkedHashMap
我们可以使用
O(1)
添加新元素,并使用
O(1)
检索元素,因此更新条目也需要O(1)。它还
保留顺序
。因此,我们可以找到最早的条目

然后,问题将通过两个步骤变得简单:

  • 建立LinkedHashMap-->O(n)
  • 查找其计数为0-->O(n)的最早数字

  • 上述每个步骤都需要O(n),因此总的
    时间复杂度为
    O(2n)=O(n)
    来查找给定整数数组中的第一个非重复数

    更新:找到了更好的解决方案。 我认为我们可以在
    O(n)
    时间复杂度中使用附加的数据结构(如HashMap)来解决它。迭代数组,将元素作为键,将元素在数组中的索引位置作为映射中的值。如果键已经存在,则可以删除键值对或将值设置为-1。 遍历整个数组后,我们可以从hashmap中获取keySet(),然后找到值最低的键(忽略-1)。 所以这就是 时间复杂度:O(N) 空间复杂度:O(N)

    旧的解决方案:我们可以通过创建另一个数组来解决这个问题,该数组是通过对给定数组进行排序获得的。这需要
    O(nlogn)
    时间。 然后我们可以迭代给定输入数组中的每个元素,尝试查找该元素并与排序数组中的下一个元素进行比较,如果重复,则继续查找给定数组中的下一个元素,如果不重复,则在给定的整数输入数组中查找第一个非重复元素

    时间复杂度:O(nlogn)
    空间复杂度:O(n)


    注:很抱歉,我没有阅读所有的评论,詹姆斯·坎泽已经在评论中提供了这个解决方案,感谢他。

    我是用PowerShell完成的

    [int[]]$arr = @(6,2,1,2,6,1,7)
    
    $Collection = New-Object 'System.Collections.Generic.list[System.Object]'
    $props=[ordered]@{"Index"=9999;"Value"=9999;"Numcount"=9999}
    $record = New-Object -TypeName psobject -Property $props
    $Collection.Add($record) #This record is added to do a Contains operation 
    #for future items to be added in the $collection object
    
    for($i =0;$i -lt $arr.Length;$i++)
    {
    if($i -eq 0)
    {
        $props=[ordered]@{"Index"=$i;"Value"=$arr[$i];"Numcount"=1}
        $record = New-Object -TypeName psobject -Property $props
        $Collection.Add($record)
    }
    
    
    elseif($Collection.value.Contains($arr[$i]))
    {
    
        $count = ($Collection | ?{$_.Value -eq $arr[$i]} | select -First `
    1).Numcount
        ($Collection | ?{$_.Value -eq $arr[$i]} | select -First 1).Numcount = `
    $count+1
    }
    else
    {
        $props=[ordered]@{"Index"=$i;"Value"=$arr[$i];"Numcount"= 1}
        $record = New-Object -TypeName psobject -Property $props
        $Collection.Add($record)
    }
    
    }
    Write-Output "The first non repeating number in the array is listed below"
    $Collection | Sort-Object Numcount -Descending | ?{$_.Numcount -eq 1} | 
    Select -First 1
    
    OUTPUT:-
    The first non repeating number in the array is listed below
    Index Value Numcount
    ----- ----- --------
    6     7        1
    

    也许它指的是不重复的连续数字,在这种情况下,你只需将一个数字与前一个数字进行比较就可以了?这似乎很琐碎,但这只是一个简单的想法。我不认为仅仅因为你使用固定大小的集合,就意味着空间复杂度为1…@Abishemanoharan fix size Collection的空间复杂度为1@na不,如果集合大小是N,那么显然不是O(1)大小的复杂性,而是O(N)。请发布准确的问题陈述。有时他们试图欺骗你,这比你想象的要简单。-1,对不起。这个答案是正确的,但它没有回答OP的问题。第一句话相当于“如果这是另一个问题,可以使用XOR运算符。”这似乎不能解决问题,数组是[1,2,3,1]?这将如何回答2?@nafas:请仔细阅读我答案的第一行。我刚刚提供了想法,根据问题的要求,想法的实际实施取决于解算器自己!@skrtbhtngr抱歉,伙计,考虑到它可以工作的条件,数组是[11,26,35,26,11],然后对所有元素进行XOR运算将给出答案:35。这是XOR运算的一个属性。如果其操作数相等,则XOR运算返回0,因此,只留下非重复元素。这样,可以使任何算法在恒定空间中执行。我怀疑这一“把戏”“是这里所期望的。不是在考试作业中。@JensG如果有上界,那么你可以让空间复杂度保持不变,你回答错误的点。问题是考试中很可能没有诡计问题。即使有,也不是那么愚蠢的问题。这是O(n)大小复杂度。恒定空间复杂度的真正含义是,算法的空间要求不取决于输入大小。如果您的算法使用(例如)4个字节来处理100个元素,那么它应该使用相同的4个字节来处理1000亿个元素,以使其具有恒定的空间复杂度。@nafas…复杂度是为算法..不是针对一个问题…仅仅因为这个问题有1M的上限并不意味着你的算法有o(1)复杂度。。。