1. 程式人生 > >數組中只出現一次的數字(java實現)

數組中只出現一次的數字(java實現)

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實現)