[オファー] [56-1] [配列が2桁に一度だけ表示されます]

タイトル説明

  両図に加えて、整数の配列は、他の図は二回表示されます。これら二つの図が表示されるだけで検索するプログラムを作成してください。必要とされる時間複雑度は、O(n)は、空間的複雑度はO(1)です。

牛が質問がネットワークに対処はねのけます

アイデア解析

  1. このタイトルは、番号に変更された場合は、一度だけ、他の二つの数字があった場合、私たちはさまざまな方法を使用することができますか、すべての数字のXORが意志表示され、結果は最終的に、それは数字のために一度だけ登場して得られました、重複した番号のXOR演算を行う各キャンセルさせて頂きますので、
  2. 我々は2つのグループに分けアレイについて話すことができ、各グループは次のようにグループ化され、上記の条件を満たしています。
  3. すべての数は、少なくとも2進数の1で、後XOR結果を排他的resultExcuORを取得したりするために、我々は、nビットで表される第1の位置を見つけ、n番目の桁は、標準のための1でありますアレイは、条件に準拠して得られた結果をグループ化し、グループ化されています。

テストケース

  1. 機能テスト:どのようにデジタル複製の配列;配列なし重複番号。

Javaコード

public class Offer056_01 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();

    }

    public static void FindNumsAppearOnce(int[] array, int num1[], int num2[]) {
        Solution1(array,num1,num2);
    }

    

    private static void Solution1(int[] array, int[] num1, int[] num2) {
        if(array==null || array.length<2){
            return;
        }
        int resultExcuOR = 0;
        for(int i=0;i<array.length;i++){
            resultExcuOR ^= array[i];
        }
        int indexOf1 = 0;
        while( ((resultExcuOR&1)==0) && indexOf1<=4*8){ 
            resultExcuOR = resultExcuOR>>1;
            indexOf1++;
        }
        
        num1[0]=0;
        num2[0]=0;
        for(int i=0;i<array.length;i++){
            if(isBit1(array[i],indexOf1)){
                num1[0] ^= array[i];
            }else{
                num2[0] ^= array[i];
            }
        }
    }

    private static boolean isBit1(int num, int indexOf1) {
        num = num>>indexOf1;
        return (num&1)==1;
    }
    
    private static void test1() {

    }
    private static void test2() {

    }

    private static void test3() {

    }

}

コードリンク

安全コードを証明するためにオファー-Java

おすすめ

転載: www.cnblogs.com/haoworld/p/offer561-shu-zu-zhong-zhi-chu-xian-yi-ci-de-liang-.html