1. 程式人生 > >一個整數陣列中,有兩個元素只出現一次,其他所有元素均出現兩次。 找出只出現一次的那兩個元素。(java實現)

一個整數陣列中,有兩個元素只出現一次,其他所有元素均出現兩次。 找出只出現一次的那兩個元素。(java實現)

一個整數陣列中,有兩個元素只出現一次,其他所有元素均出現兩次。 找出只出現一次的那兩個元素。

思路大概是這樣的:因為除了這兩個只出現一次的數字外,其餘都是成對出現的,有一種運算子,異或運算,兩個相同的數字異或之後為0,所以將陣列中所有的數字依次異或,結果就是這個兩個支出現一次的的數異或的結果;接下來就是如何將他們分開,因為這兩個數不相同,所以異或的結果必定不為0,找出這個異或的結果的 二進位制表示中第一次出現醫德位數,按這個條件,將原來的陣列分為兩個子陣列,然後將他們中的數字依次異或即可得到陣列中只出現依次的的兩個數。

java程式碼實現:(其中部分借鑑了一下網上的)

public class main {
    public static  int[] fun(int []a){
     int n=0;
     int[] res = new int[2];
     for(int i=0;i<a.length;i++){
         n^=a[i];
     }
     int index = findFirst1(n);
     for(int i = 0; i < a.length; ++i){
         if(isBit1(a[i], index)){
             res[0] ^= a[i];
            }else{
                res[1] ^= a[i];
            }
        }
        return res;
    }
//找出二進位制表示中第一個為1的位數
    private static int findFirst1(int bitResult){
        int index = 0;
        while(((bitResult & 1) == 0) && index < 32){
            bitResult >>= 1;
            index++;
        }
        return index;
    }
//對原陣列進行分類
    private static boolean isBit1(int target, int index){
        return ((target >> index) & 1) == 1;
    }
    public static void main(String[] args) {
        int[] a = {3, 2, 5, 8, 4, 2, 3, 7, 5, 8};
        for (int n : fun(a)) {
            System.out.println(n);
        }
    }
}