題目:
一個整型數組里除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。要求時間復雜度為O(n),空間復雜度為O(1)
解法
分析:
如果只有一個數字出現一次,要找出這個數字,那直接依次異或,因為兩個相同的數字亦或結果為0,0與任何數字異或結果還是那個數字。
現在出現兩個,那么考慮分成兩個子數組,但是要求成對的數字分在一起,那兩個不同的數字分別在兩個子數組里。
- 所有數字依次異或,結果為那兩個不同的數字異或的結果,并且結果一定非0,記為a
- 從左至右找出a第一個bit位非0的index,以此為依據將原數組分為兩個子數組(這樣的分類標準可以達到上述的目的:1)相同的數字一定落在同一個子數組里 2)那兩個不同的數字分布在不同的子數組里)
- 分成兩個子數組后,分別異或即可