1. 題目
一個整型數組 nums 裏除兩個數字之外,其他數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。要求時間複雜度是O(n),空間複雜度是O(1)。
2. 解題思路
詳情見 數組中數字出現的次數
需要知道的是,數字 a 異或 a 的結果是0,而0與任何數異或的結果是那個數本身。
如果數組中只有1個只出現一次的數字
那麼對數組中的元素不斷進行異或即可,因爲其他數字都是成對出現的,這些數字異或之後都會是0,所以最後異或的結果就是這個只出現了1次的數字。
但是現在是兩個只出現一次的數字。
將數組分爲兩部分
這兩個只出現1次的數字分別位於兩個子數組的中,而且成對出現的數必須要同一子數組中。
步驟:
1)先對所有數字進行一次異或,得到兩個出現一次的數字的異或值。
2)在異或結果中找到任意爲 1 的位。
3)根據這一位對所有的數字進行分組。
4)在每個組內進行異或操作,得到兩個數字。
3. 代碼實現
3.1 分組異或
class Solution:
def singleNumbers(self, nums: List[int]) -> List[int]:
ret = functools.reduce(lambda x, y: x ^ y, nums) # 1.對整個數組異或
div = 1
while div & ret == 0: # 2.找到爲1的位
div <<= 1
a, b = 0, 0
for n in nums:
if n & div: # 3.根據這一位是否爲1對原數組中的元素進行分組異或
a ^= n
else:
b ^= n
return [a, b]
作者:LeetCode-Solution
鏈接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/solution/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-by-leetcode/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
4. 總結
只能說看完了這個題之後,發現奇怪的知識又增加了。O(∩_∩)O
5. 參考文獻
[1] 劍指offer叢書
[2] 劍指Offer——名企面試官精講典型編程題
[3] 數組中數字出現的次數