題目描述
一個整型數組裏除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。
解題思路
兩個相同的數異或得到 0,任何數和 0 異或得到原來的數。可以將所有的數異或(其實就是兩個出現一次的數異或),得到一個數 a,然後判斷 a 中第一位不爲 0 的位,也即第一位不相同的位。然後根據該爲是 1 和 0 的情況分成兩組數(相同的數肯定在同一組),兩組分別對組內所有數進行異或,最後就得到兩個只出現一次的數。
實現
//num1,num2分別爲長度爲1的數組。傳出參數
//將num1[0],num2[0]設置爲返回結果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if (array == null || array.length < 2) return;
//數組中每個數進行異或操作,得到一個不爲0的數,找出其中不爲1的位
//兩個相同的數異或的結果爲0,不同的肯定不爲0。根據的到的1位,將數組分成
//那個位爲0和那個爲1位的子數組,兩個不同的數位於不同的子數組
//然後對每個子數組中的數進行異或,得到的結果就是隻出現過一次的數
int reOR = 0;
for (int i : array) {
reOR ^= i;
}
//找出1的位置
int index = findFirstOne(reOR);
num1[0] = 0;
num2[0] = 0;
for (int i : array) {
if (isOne(i,index)){
num1[0] ^= i;
}else {
num2[0] ^= i;
}
}
}
private boolean isOne(int i, int index) {
return (i & (1 << index)) != 0;
}
private int findFirstOne(int reOR) {
int count = 0;
while ((reOR & (1 << count)) == 0){
count ++;
}
return count;
}
}