數組中只出現一次的數字(java實現)
阿新 • • 發佈:2018-08-29
num 整型 根據 長度 問題 程序 oid [] 情況
問題描述
一個整型數組裏除了兩個數字之外,其他的數字都出現了偶數次。請寫程序找出這兩個只出現一次的數字。
解題思路
如果數組中只有一個數字出現奇數次,則將數組中所有的數字做異或可得該數字。
數組中有兩個數字出現奇數次,設這兩個數字分別為a、b,則將數組中所有的數字做異或得到的是a與 b異或的結果,設為xor。
數字a與b不同,則a與b的二進制表示中至少存在1位不同,xor二進制表示中為1的位即是a與b不同的位,假設a與b的第k位不同,a在該位上為1,b在該位上為0 。(k可以選取為從起始位開始的第一個不同的位)
則可以根據數字第k位的取值情況將數組分為兩個字數組,第k位為1的子數組必包含a與其他出現偶數次的數字(相同的數字第k位肯定相同),第k位為0的子數組必包含b與其他出現偶數次的數字。
子數組中的數字做異或可分別得到數字a與b。
實現代碼
//num1,num2分別為長度為1的數組。傳出參數 //將num1[0],num2[0]設置為返回結果 public void findNumsAppearOnce(int[] array, int num1[], int num2[]) { // 得到兩個數字的異或結果xor int xor = 0; for (int i=0; i<array.length; i++) xor ^= array[i]; // 求兩個數字第一個不同的位, 有temp記錄// 若temp=00100000 表示兩個數字的第6位不同 int temp = 1; while ((xor & 1) != 1) { temp = temp << 1; xor = xor >> 1; } // 根據temp將數組分為兩個子數組,並分別做異或 num1[0] = 0; num2[0] = 0; for (int i=0; i<array.length; i++) if ((array[i]&temp) == temp) num1[0] ^= array[i];else num2[0] ^= array[i]; }
數組中只出現一次的數字(java實現)