劍指Offer_40_數組中只出現一次的數字

題目描述

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

解題思路

兩個相同的數異或得到 0,任何數和 0 異或得到原來的數。可以將所有的數異或(其實就是兩個出現一次的數異或),得到一個數 a,然後判斷 a 中第一位不爲 0 的位,也即第一位不相同的位。然後根據該爲是 1 和 0 的情況分成兩組數(相同的數肯定在同一組),兩組分別對組內所有數進行異或,最後就得到兩個只出現一次的數。

實現

//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;

        //數組中每個數進行異或操作,得到一個不爲0的數,找出其中不爲1的位
        //兩個相同的數異或的結果爲0,不同的肯定不爲0。根據的到的1位,將數組分成
        //那個位爲0和那個爲1位的子數組,兩個不同的數位於不同的子數組
        //然後對每個子數組中的數進行異或,得到的結果就是隻出現過一次的數
        int reOR = 0;
        for (int i : array) {
            reOR ^= i;
        }

        //找出1的位置
        int index = findFirstOne(reOR);
        num1[0] = 0;
        num2[0] = 0;
        for (int i : array) {
            if (isOne(i,index)){
                num1[0] ^= i;
            }else {
                num2[0] ^= i;
            }
        }
    }

    private boolean isOne(int i, int index) {
        return (i & (1 << index)) != 0;
    }

    private int findFirstOne(int reOR) {

        int count = 0;

        while ((reOR & (1 << count)) == 0){
            count ++;
        }

        return count;
    }
}
發佈了75 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章