劍指offer系列-面試題56 - I. 數組中數字出現的次數 (python)

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] 數組中數字出現的次數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章