面試題44 陣列中只出現1次的數字

2021-07-09 08:25:33 字數 1042 閱讀 6683

題目:

乙個整型陣列中,除了兩個數字之外,其他的數字都出現了兩次。求寫程式找出這兩個只出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1)。

邊界條件及異常:

陣列為空,沒有只出現一次的數,只有乙個只出現一次的數。

思路:這題好難!

首先我們考慮如果陣列中只有乙個數字只出現一次,其他的都出現兩次,應該怎樣做?

由於兩個相同數字異或後為0,所以我們可以將陣列從第乙個數開始到最後乙個數進行異或,最後得到的結果就是只出現一次的數字。

但是如果有兩個只出現一次的數呢?

書中提供的思路是將陣列分成兩部分,每部分包含乙個只出現一次的數字和其他只出現兩次的數字。那麼問題來了,怎麼分呢?

我們先將所有數字異或,最後得到的結果是那兩個只出現一次的數字的異或,由於這兩個數字不相同,所以不為0。

我們在結果中找到第乙個不為0的位置,記為第n位。

於是我們分組時可以根據第n位是0還是1來分,這樣可以保證:

1)兩個只出現一次的數在不同的組

2)相同的數字在同乙個組

分組完成後就按照只有乙個數字出現一次來做就ok了。

#include #include #include #include #include #include #include //for hashtable  

#include #include #include #include using namespace std;

using namespace std;

bool isbit1(int num, unsigned int indexbit)

unsigned int findfirstbitis1(int num)

return indexbit;}}

int main()

; vectornums(arr, arr + 6);

int num1 = 0, num2 = 0;

cout << num1 << " " << num2 << endl;

return 0;

}

《劍指Offer》面試題 陣列中只出現一次的數字

題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。思路根據異或去重的原理,我們知道如果只有乙個只出現一次的數字的求法,但這裡是有兩個只出現一次的數字,我們便要想辦法把他分為兩個子陣列,每個子陣列中包含乙個只出現一次的數字,其他的數字都出現了兩次。劍...

陣列中只出現1次的兩個數字 面試題

這個題如果換成陣列中只出現一次的乙個數字,就非常好做了,大家都知道這個題目如何做,其實陣列中出現一次的數字有兩個也可以使用異或的方式來處理,不過不能直接進行判斷,需要分成兩組,每一組含有乙個只出現一次的數字,現在問題來了?應該如何把這兩數字進行分開,而且每乙個陣列都要含有除了只出現一次數字其他數必須...

面試題37 陣列中只出現一次的數字

題目 整型陣列中除了兩個數字之外,其他的數字都出現兩次,找出這兩個只出現一次的數字 思路 利用異或運算的性質 任何乙個數字異或自己都等於0 1.從頭到尾依次異或陣列中的每個數字,最終得到的結果就是兩個只出現一次的數字的異或結果 2.異或結果的二進位制表示中至少有一位為1,找到結果數字中第乙個為1的位...