面試題40: 數組中只出現一次的數字

一. 題目
一個整型數組裏除了兩個數字之外,其他的數字都出現了兩次.請寫程序找出這兩個只出現一次的數字.要求時間複雜度是O(n),空間複雜度是O(1).

代碼請到我的代碼庫中下載 Point2Offer

二. 代碼

package week_3;
/**難度係數:***
 * 劍指offer: 數組中只出現一次的數字
 * 方法:異或運算,給數組分組(根據異或之後的第一個1)
 * 測試用例:功能測試(數組中存在多對重複數字,數組中沒有重複的數字)
 * @author dingding
 * Date:2017-6-28 9:00
 * Declaration: All Rights Reserved!
 */
public class No40 {

    public static void main(String[] args) {
        test1();
        test2();
        test3();
    }
    //solution
    private static void findNumsAppearOnce(int[] data,int length){
        if (data == null || length<1) {
            return;
        }
        int resultExclusiveOR = 0;
        for (int i=0;i<length;i++){
            resultExclusiveOR ^=data[i];
        }
        int indexOf1 = findFirstBitIs1(resultExclusiveOR);
        int number1 = 0;  //第一個出現一次的數字
        int number2 = 0;
        for (int j=0;j<length;j++){
            if (isBit1(data[j],indexOf1)) {
                number1 ^=data[j];
            }else {
                number2 ^=data[j];
            }
        }
        System.out.println("這兩個數爲: "+number1+","+number2);
    }

    //查找數組中第n位也爲1的數字,indexof1 返回的是1的下標,故不用加1
    private static boolean isBit1(int num, int indexOf1) {
        boolean flag = false;
        num = num >>indexOf1;
        if ((num & 1) == 1) {
            flag = true;
        }
        return flag;
    }
    //找到異或結果中右起第一個1
    private static int findFirstBitIs1(int resultExclusiveOR) {
        int indexBit = 0;
        while ((resultExclusiveOR & 1)==0){
            resultExclusiveOR = resultExclusiveOR >> 1;
            ++ indexBit;
        }
        return indexBit;
    }
    /*=====================測試用例=================*/
    private static void test1() {
        int[] data= {2, 4, 3, 6, 3, 2, 5, 5};
        findNumsAppearOnce(data, data.length);
    }

    private static void test2() {
        int[] data= {3, 4};
        findNumsAppearOnce(data, data.length);
    }

    private static void test3() {
        int[] data= {4, 6, 1, 1, 1, 1};
        findNumsAppearOnce(data, data.length);
    }

}



有不妥當之處,麻煩告知:D

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章