如何在数组中找到两个不成对的元素?
您有一个包含 n=2k+2 个元素的数组,其中 2 个元素未配对。 8 元素数组的示例:1 2 3 47 3 1 2 0。“47”和“0”在数组中没有配对。如果我的数组中只有 1 个元素没有配对,我可以使用 XOR 解决这个问题。但我有两个不成对的元素!我能做些什么?解决方案可能是 O(n) 时间性能和 O(1) 额外内存。
You have an array with n=2k+2 elements where 2 elements haven't pair. Example for 8 elemets array: 1 2 3 47 3 1 2 0. "47" and "0" haven't pair in array. If I have array where only 1 element has't pair, I solve this problem with XOR. But I have 2 unpair elements! What can I do? Solution could be for a O(n) time performance and for O(1) additional memory.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
一些提示...
需要 2 次通过。首先,遍历列表并将所有元素异或在一起。看看你会得到什么。从那里继续。
编辑:关于第一遍结果的关键观察应该是它显示了 2 个不成对元素不同的位集。
Some hints...
It will take 2 passes. First, go through the list and XOR all elements together. See what you get. Proceed from there.
Edit: The key observation about the result of the first pass should be that it shows you the set of bits in which the 2 unpaired elements differ.
使用 INT_MAX/8 字节内存。走阵。将每个值对应的位与 1 进行异或。如果有 0 或 2 个实例,则该位最终为 0。如果只有 1 个实例,则将其设置。 O(1) 内存,O(N) 时间。
Use INT_MAX/8 bytes of memory. Walk the array. XOR the bit corresponding to each value with 1. If there are 0 or 2 instances the bit will end up 0. If there is only one instance, it will be set. O(1) mem, O(N) time.
这是 O(n)。
This is O(n).
你可以试试这个。这将需要 O(n) 时间
解释...
arr[] = {2, 4, 7, 9, 2, 4}
1) 获取所有元素的异或。
异或 = 2^4^7^9^2^4 = 14 (1110)
2) 获取一个只有一位异或的数字。
由于我们可以轻松获得最右边的设置位,因此让我们使用它。
set_bit_no = 异或 & ~(xor-1) = (1110) & 〜(1101)= 0010
现在 set_bit_no 将仅设置为异或的最右边设置位。
3)现在将元素分为两个集合并进行异或
每个集合中的元素,我们得到不重复的
要素 7 和 9。
You can try this.It will take O(n) time
Explanation...
arr[] = {2, 4, 7, 9, 2, 4}
1) Get the XOR of all the elements.
xor = 2^4^7^9^2^4 = 14 (1110)
2) Get a number which has only one set bit of the xor.
Since we can easily get the rightmost set bit, let us use it.
set_bit_no = xor & ~(xor-1) = (1110) & ~(1101) = 0010
Now set_bit_no will have only set as rightmost set bit of xor.
3) Now divide the elements in two sets and do xor of
elements in each set, and we get the non-repeating
elements 7 and 9.