題目:乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1)。
思路:如果乙個陣列中乙個數字只出現一次,其它數字出現兩次,找到只出現一次的數字,這個問題比較好實現,利用異或運算的特點(任何乙個數字異或它自己都等於0),如果我們從頭到尾依次異或陣列中的每個數字,那麼最終的結果剛好是那個只出現一次的數字,因為那些成對出現兩次的數字全部在異或中抵消了。因此該題的主要難點是如何把給定陣列轉化分解為滿足此條件的陣列。因此解題過程可以分為兩步:
第一步——把原陣列分為兩個子陣列,使得每個子陣列包含乙個只出現一次的數字,而其他數字都成對出現兩次
從頭到尾依次異或陣列中的每個數字,在結果數字中找到第乙個為1的位的位置,記為第n位(indexof1),並以第n位是不是1為標準把原陣列中的數字分為兩個子陣列,第乙個陣列中每個數字的第n位都是1,第二個陣列中每個數字的第n位都是0。
第二步——依次異或子陣列中的每個數字,最終的結果剛好為只出現一次的數字
分別依次異或兩個子陣列,最後兩個子陣列陣列的異或結果就是那兩個只出現一次的數字。
核心**如下:
unsigned int findfirstbitis1(int num);
bool isbit1(int num, unsigned int indexbit);
if(data == nullptr || length < 2)
return;
int result = 0;
for(int i = 0; i < length; i++)
result ^= data[i]; //從頭到尾依次異或陣列中的每個數字,得到兩個只出現一次的數字的異或結果
unsigned int indexof1 = findfirstbitis1(result);
*num1 = *num2 = 0; //*num1,*num2最終存放陣列中只出現一次的兩個數字
for(int j = 0; j < length; j++)
}//用來在整數num的二進位制表示中找到最右邊是1的位,例如num = 2,indexbit = 1
unsigned int findfirstbitis1(int num)
return indexbit;
}//判斷在num的二進位制表示中從右邊數起的indexbit位是不是1
bool isbit1(int num, unsigned int indexbit)
陣列中只出現一次的數字41
題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 例如,因為只有4,6這兩個數次出現一次,所以輸出4和6。解題思路 陣列裡有兩個數字只出現一次,其他數字都出現兩次。異或性質 任何乙個數字異或它自己都等於0...
陣列中只出現一次
首先看看題目要求 陣列a中,除了某乙個數字 x之外,其他數字都出現了三次,而 x出現了一次。請給出最快的方法找到x。這個題目非常有意思,在本人部落格中有 位操作基礎篇之位操作全面總結 這篇文章介紹了使用位操作的異或來解決 陣列中其他數字出現二次,而x出現一次,找出x。有 這邊文章介紹了分組異或的方法...
陣列中只出現一次的數字
何海濤 劍指offer 名企面試官精講典型程式設計題 九度oj 題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。輸入 每個測試案例包括兩行 第一行包含乙個整數n,表示陣列大小。2 n 10 6。第二行包含n個整數,表示陣列元素,元素均為int。輸...