在整数数组中查找第一个不重复的数字
Finding first non-repeating number in integer array
我的考试题目是:
给定一个整数数组,用O(N)的时间复杂度和O(1)的空间复杂度找到数组中第一个不重复的数字
我想不出任何解决办法。我知道我可以遍历数组并维护一个linkedhashmap,它将存储数组元素和它出现的次数,然后最后我必须搜索hashmap来找到那个数字。空间复杂度大于0(1)但我想不出其他的解决方案。
我也仔细阅读了问题,说数组的最大大小将是100万。我认为,如果我们可以创建一个自定义哈希映射,它将利用一个固定大小的100万大小的数组,那么这可以在0(1)空间复杂度中实现,因为在这种情况下,所需的存储将是恒定的,但更确定如果我是正确的。如果有其他的解决办法,请告诉我。
如果除一个元素外的所有元素都有两个(或2的倍数)条目,且该元素不重复,则可以使用异或运算符。
的例子:
int x=arr[0];
for(i=1;i<1000;i++)
x^=a[i];
printf("Non-repeating: %d",x);
任何数与自身相乘等于0。因此,如果任何数字出现两次,那么它在整个异或结果中将为0,从而只在x
中留下不重复的数字。
注意:如果您有100万个数字,用于存储异或结果的变量必须足够大
查找给定整数数组中的第一个非重复数
更新:找到更好的解决方案。我认为我们可以使用额外的数据结构(如HashMap)来解决O(n)
时间复杂度问题。遍历数组,并将元素作为键,并将元素在数组中的索引位置作为映射中的值。如果键已经存在,可以删除键-值对,或者将值设置为-1。一旦遍历了整个数组,我们就可以从hashmap中获得keySet(),然后找到值最小的键(忽略-1)。所以这是时间复杂度:0 (N)空间复杂度:O(N)
旧的解决方案:我们可以通过创建另一个数组来解决这个问题,这个数组是通过对给定数组进行排序得到的。这需要O(nlogn)
时间。然后我们可以遍历给定输入数组中的每个元素,尝试找到元素&与已排序数组中的下一个元素比较,如果重复,则继续查找给定数组中的下一个元素,如果不重复,则找到给定输入整数数组中第一个不重复的元素。
时间复杂度:O(nlogn)
空间复杂度:O(n)
p。S:很抱歉,我没有看到所有的评论,James Kanze已经在评论中提供了这个解决方案,感谢他。
我使用的是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
我相信解决这个问题的诀窍是:
自:数组的最大大小为100万
0(1)空间表示算法所需的内存常数
,则给定1M不变,空间复杂度将自动变为O(1)。请注意。1M仍然是一个常数,尽管它是一个很大的数。因此,我们只需要关注时间复杂度。
使用LinkedHashMap
,我们可以使用O(1)
添加一个新元素,并使用O(1)
检索元素,因此更新一个条目也将花费O(1)。它也是preserves the order
。因此,我们可以找到最早的条目
那么问题就变得简单了,分两步:
- 建立LinkedHashMap -> 0 (n)
- 查找其计数为0 -> 0 (n)
以上每一步都需要O(n),因此总的time complexity
是O(2n) = O(n)
。
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 我必须更改我的数字最后一个数字和第一个数字,但不要使用仅带有整数或循环的函数.例如从 12345 到 52341
- OpenGL:第二个VBO破坏了第一个VBO
- 将一个数字拆分为多个数字,每个数字只有一个有效位
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 在我的第一个C++程序中需要一些帮助(简单)
- 为什么我的代码在第一个 if 语句处中断?
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 在将字符串转换为整数后,是否有一种方法可以保持数字的第一个零