數組中只出現一次的數字

題目描述

一個整型數組裏除了兩個數字以外,其餘的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。java

思路

相同的數異或爲0,數字與0異或爲其自己。
若是數組中只出現一次的數字僅一個,將數組的全部元素異或就能夠獲得單獨的那個數字。
題目中特意提到只出現一次的數字有兩個,因此須要先將數組拆分紅兩個,每一個子數組裏分配一個出現了一次的數字,而後分別異或即爲答案:數組

  1. 將數組內全部數字進行異或,由於其餘數字都出現了兩次,因此結果爲兩個只出現一次數字的異或。
  2. 兩個不一樣的數字異或結果中,確定至少有一位等於1,能夠用來區分這兩個數字,而且能夠根據該位爲0或1將數組分組。
  3. 將兩個子數組全部元素異或,能夠找出答案的兩個數。

時間複雜度O(n),空間複雜度O(1)。code

代碼

//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 ;
        int tmp = array[0];
        for(int i = 1; i < array.length; i++) {
            tmp ^= array[i];
        }
        int flag = 1;
        while((flag & tmp) == 0) {
            flag <<= 1;
        }
        num1[0] = 0;
        num2[0] = 0;
        for(int i = 0; i < array.length; i++) {
            if((flag & array[i]) == 0) {
                num1[0] ^= array[i];
            } else {
                num2[0] ^= array[i];
            }
        }
    }
}
相關文章
相關標籤/搜索