1.乙個陣列中除了兩個數字之外,其他的式數字都出現了兩次。找出這個兩個只出現一次的數字,要求時間複雜度是o(n),空間複雜度是o(1).
分析:這種題目剛開始很難相處滿足條件的要求,要求在o(n)的時間複雜度還是比較高的,可以先假設陣列中只有乙個數字出現了一次,其他的數字都出現了兩次,如果是這種情況,可以採用逐個數字相異或的方法,這樣相同的數字異或的結果就是0,最後剩下的結果就是那個不同的數字。這樣的時間複雜度是o(n),但是題目是要求是找兩個只出現的數字,這樣講全部的數字異或之後,結果肯定不是0,但是異或的結果是那兩個只出現了一次的數字異或的結果。這樣的話加過不為0,從二進位制的角度看,其中肯定至少有一位不為0,比如找到結果中第乙個不為0的位置,則這兩個數字在在位置的肯定有乙個是1,另乙個是0,相異或的結果才是1.可以依據這個規則將這兩個數字分開,可以類似的將其他的數字分開,其他的出現的兩次的數字在這個位置的值可能是1,也可能是0.但是不管是1還是0,依據這個規則,相同的數字肯定是會分到一組,這樣會得到兩組數字,兩個分別只出現一次的數字是分開的,並且其他的出現的兩次的數字依據規則分在不同的組,但是完全相同的數字肯定是在一組,這樣在兩組中分別使用異或規則,可以在每一組中找到乙個這樣的數字。
原始碼:
/**
* 功能說明:description
* 日期:2016-9-13
**/#includeusing namespace std;
bool isbit1(int num, unsigned int indexbit);
unsigned int findfirstbitis1(int num);
int main()
; int result1, result2;
cout << "the two numbers are : " << result1 << " " << result2 << endl;
system("pause");
return 0;}}
// 找到num從右邊數起第乙個是1的位
unsigned int findfirstbitis1(int num)
return indexbit;
}// 判斷數字num的第indexbit位是不是1
bool isbit1(int num, unsigned int indexbit)
面試題40 陣列中只出現一次的數字
參考 1.2.題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 需要用到的知識 位運算的異或操作 1.按位異或運算定義 1 1 0 1 0 1 0 1 1 0 0 0 2.規律 定理一a b b a 定理二 ...
面試題40 陣列中只出現一次的數字
題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解題思路 若是陣列中只有乙個數字出現一次,其餘的數字都出現偶數次,那麼直接將陣列中所有的數進行異或運算,得到的最後的結果就是出現一次的數 出現奇數次的數字 但是,題目要求是有兩個數出現一次,那麼上述...
面試題40 陣列中只出現一次的數字
題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。這其實是除了有乙個數字外,其它數字都出現兩次的變種。只有乙個數字不同的時候,可以採用異或來做。但此處是兩個不同。書上給出的方法是先異或,得到結果值。然後在結果中,從右往左找到第一位是1的位號。由此考慮將...