題目1:乙個陣列中,除了某乙個只出現過一次的數字外,其餘數字均出現過2次,找出這個只出現了一次的數字。
思路:分析題幹,發現強調了陣列中數字出現的次數為1和2,則可以想到異或運算,兩個相同的數字異或結果為0,相同的數異或的結果為其本身,且異或運算存在交換律和結合律,即a^b^a=b, b^a^a=b。那麼利用異或運算的這些性質即可求解本題:依次將陣列的每個數進行異或運算,異或的結果即為所求。
題目2:乙個陣列中,除了某兩個只出現過一次的數字外,其餘數字均出現過2次,找出這兩個只出現了一次的數字。
思路:基於題目1的思路來分析第二題。可以將陣列分為2組,如果這兩個特殊的數剛好出現在這兩個陣列中,那對這兩個陣列分別求異或即可。現在的問題是如何進行分組?乙個思路是先對原陣列求異或,則得到的結果為這兩個特殊數字的異或值tmp,找到tmp中第乙個為1的位n,說明這兩個數第n位乙個為1乙個為0。 按照這個思路將所有數字分組:將第n位為1和為0的數字分為兩組,此時這兩個特殊的數字分別出現在這兩個陣列中,那麼對這兩個陣列分別進行異或計算即可得到這兩個數。
下面給出第2題的**:
if(data.size() < 2)
return ;
int tmp = 0;
for(int i = 0; i < data.size(); i ++) //求出所有數字的異或結果存在tmp中
tmp ^= data[i];
int n = 0; //tmp第乙個為1的位數
while(tmp != 0)
*num1 = 0;
*num2 = 0;
for(int i = 0; i < data.size(); i ++)
}
陣列中只出現一次的數
首先看看題目要求 陣列 a中,除了某乙個數字 x之外,其他數字都出現了三次,而 x出現了一次。請給出最快的方法找到x。這個題目非常有意思,在本人部落格中有 位操作基礎篇之位操作全面總結 這篇文章介紹了使用位操作的異或來解決 陣列中其他數字出現二次,而x出現一次,找出x。有 這邊文章介紹了分組異或的方...
陣列中只出現一次的數
題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。思路 首先 位運算中異或的性質 兩個相同數字異或 0,乙個數和0異或還是它本身。當只有乙個數出現一次時,我們把陣列中所有的數,依次異或運算,最後剩下的就是落單的數,因為成對兒出現的都抵消了。依照這個思路...
陣列中只出現一次的數
問題一 在乙個整數陣列中,除了乙個數之外,其他的數出現的次數都是兩次,求出現一次的數,要求時間複雜度盡可能的小。例如陣列,出現一次的數是1.從題目的描述可以看出,陣列中只有乙個數字出現了一次,其他的數字都出現兩次,聯想到異或運算的特點 任何乙個數字和自己做異或運算的結果都是0,任何數字和0運算的結果...