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