給定一個具有n+2
元素的數組,陣列中的所有元素都在1
至n
的範圍內,並且除兩個出現兩次的元素外,所有元素只出現一次。查找給定數組中的2個重複元素
查找這2個重複數字。例如,如果陣列是[4, 2, 4, 5, 2, 3, 1]
,然後n
是5,有n+2 = 7
元素與存在的只有一次除2和4
所有元素所以我的問題是如何使用XOR操作,以解決上述問題。我在其他網站上看到了解決方案,但我無法理解它。請考慮下面的例子:
arr[] = {2, 4, 7, 9, 2, 4}
- XOR每一個元素。
xor = 2^4^7^9^2^4 = 14
(1110
) - 優惠數目僅具有一個異或的設置位。由於我們可以輕鬆獲得最右邊的一組,所以讓我們使用它。
set_bit_no = xor & ~(xor-1) = (1110) & ~(1101) = 0010
。現在set_bit_no
將只設置爲xor
的最右邊的設置位。- 現在分在兩組中的元素,做每一組元素的XOR,我們得到的非重複元素7和9
如果你已經知道算法,也許你可以在這裏顯示它。特別是,你不明白哪一步? – Michiel
@MichielUitHetBroek我無法理解上面示例中的步驟2和3 – Preetib
@Preetib看看能否理解[this explanation](http://stackoverflow.com/a/22953668/1081569)。這個想法是,如果你用1到n的列表對列表中的所有元素進行異或,結果是重複元素的異或(因爲其他元素會自己取消)。然後你在XOR中設置一點,這意味着它在重複的元素中是不同的,並根據是否設置了該位來將它們分成兩組。最後,除了那些你正在尋找的人以外,你對這些組中的每一個進行XOR,並且所有的數字都會被自己取消。 –