如何解决在一个数组中找到两个元素,这些元素仅发生一次
最近我得到了以下任务:
假设给定一个长度为 N 的元素数组,其中除两个 special (出现一次)之外的每个元素都出现两次。找到此特殊号。
我还知道数组中的每个元素都是非负数且不超过10 ^ 9,并且数组的长度 N 小于或等于10 ^ 6
我认为解决方案是使用xor。这是我的想法:
让xor或数组中的所有元素。由于xor是可交换的,例如xor(a,b)= xor(b,a),我们可以得出结论,两次出现的所有元素都将被清零:
xor(a,b,a,c)= xor(a,a,b,c)= xor(xor(a,a),b,c)= xor(0,b,c)= xor( b,c)
然后对整个数组进行异或运算,我们将得到两个 special 元素的异或。接下来做什么?也许还有其他解决方案?
PS 。请不要告诉我有关散列表的任何信息。首先,我已经尝试过了,但是没有用,因为我的哈希函数无法将所有范围的数字压缩到任何合理大小的数组中(至少对于我的机器而言)。其次,受任务条件的限制。
编辑:糟糕,我没有提到排序也是禁止的。
解决方法
以良好的方式进行加法。
想一想-将所有元素异或的结果是什么?如您所写,所有配对的元素都归零,因此结果为
R = A xor B
考虑结果R
的一位-我们可以看到它们对应于A
和B
的不同位。
因此,我们可以选择R
的任何非零位,并进行第二次运行-但只能将元素将该位非零排他。
现在我们有了新结果-它等于A
或等于B
。
计算第二个是基本的:B = R xor A
复杂度保持线性O(n)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。