1. 程式人生 > >Python 異或尋找只出現一次的兩個數

Python 異或尋找只出現一次的兩個數

 一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。例如陣列為{1,3,5,7,1,3,5,9},找出7和9。

/*
 解法1:
1、思路:
(1)對於出現兩次的元素,使用“異或”操作後結果肯定為0,那麼我們就可以遍歷一遍陣列,對所有元素使用異或操作,那麼得到的結果就是兩個出現一次的元素的異或結果。
(2)因為這兩個元素不相等,所以異或的結果肯定不是0,也就是可以再異或的結果中找到1位不為0的位,例如異或結果的最後一位不為0。
(3)這樣我們就可以最後一位將原陣列元素分為兩組,一組該位全為1,另一組該位全為0。
(4)再次遍歷原陣列,最後一位為0的一起異或,最後一位為1的一起異或,兩組異或的結果分別對應著兩個結果。
2、複雜度:
  (1)時間複雜度:第一次迴圈,將所有元素異或得到對應結果,時間開銷為O(n);第二次迴圈,找出第一次異或結果為1的位,時間開銷為O(32);第三次迴圈,根據為1的位將元素分為兩組進行異或得到兩個結果,時間複雜度為O(n),所以總的時間複雜度為T(n) = 2*O(n)+O(32) = O(n)。
  (2)空間複雜度:常數,因為只分配了兩個空間用於結果的儲存,因此空間複雜度為常數。
 */

    public static int[] findNumsAppearOnce2(int[] arr) {
        if(arr.length < 2)
            return arr;

        int[] result = new int[2];  //要返回的結果  
        int res = arr[0];  //第一次對所有元素進行亦或操作結果  
        for(int i=1; i<arr.length; i++) {
            res ^= arr[i];
        }
        int bitIndex = 0;
        for(int i=0; i<32; i++) {  //找出亦或結果為1的位。  
            if((res>>i & 1) == 1) {
                bitIndex = i;
                break;
            }
        }
        for(int i=0; i<arr.length; i++) { //根據bitIndex為1,將元素分為兩組  
            if((arr[i] >> bitIndex & 1) == 1)
                result[0] ^= arr[i];   //對應位為1,亦或得到的結果  
            else
                result[1] ^= arr[i];   //對應位為0,亦或得到的結果  
        }

        return result;
    }