題目
一個整型數組裏除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。
思考
- 異或操作,二進制數的每位進行異或,相同爲0,不同爲1.
- 兩個相同的數進行異或,結果爲0。
- 如果題目 改爲 “只有一個數只出現過一次,其他的都出現了2次”,全部數字異或運算,最終的結果就是隻出現一次的數字,解題如下
public int findNum(int nums[]) {
int result = 0;
for (int num : nums) {
result = result ^ num;
}
return result;
}
- 本題中有兩隻出現過1次的數字,那麼所有數字異或的結果即爲那兩個單一數字異或的結果。
- 接下來要做的是,把數組劃分成兩組A、B,兩個出現一次的數字分在不同的組裏,相同的數字分在同一個組了,這樣就把問題轉換成上面的形式了
- 兩個不同的數異或,不同的位,值爲1,利用這個特點就劃分兩個組了。
result = result & -result
得到出 result 最右側不爲 0 的位
//num1,num2分別爲長度爲1的數組。傳出參數
//將num1[0],num2[0]設置爲返回結果
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int result = 0;
for (int num : array) {
result = result ^ num;
}
result = result & -result;
for (int num : array) {
if ((num & result) == 0) {
num1[0] = num1[0] ^ num;
} else {
num2[0] = num2[0] ^ num;
}
}
}