[オファー] [56-2] [ユニークな配列番号1度だけ表示]

タイトル説明

  数の配列に加えて、一度だけ表示され、他の人物が登場してきた三回一度だけ表示される番号を検索

ノー[牛質問アドレスネットワークをはねのけます]

アイデア解析

  各ビットの数が3回表示された場合、そこ三回そのバイナリ表現(0または1)。すべての3つはそれぞれ、その後、表現を表示され、3で割り切れることができる場合には、各二進数の各ビットが加算します。それぞれが、我々はバイナリ表現の配列を持っているすべての数値を加算します。3たかのビットと分割は、その後一度だけ0であるものの対応するバイナリ表現で表示される数字は、そうでない場合、それは1です。

テストケース

  1. 機能テスト:ザ・は唯一の数字が0、正、負だった一度だけ表示されます。デジタルは、それぞれ0、正、負の3回繰り返します。

Javaコード

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

    public static int findNumberAppearingOnce(int[] array) {
        return Solution1(array);
    }


    private static int Solution1(int[] array) {
        if(array==null || array.length<=0) {
            return -1;
        }
        
        int[] bitSum = new int[32];
        for(int i=0;i<array.length;i++) {
            int bitMask = 1;
            for(int j=31;j>=0;j--) {//将每个数字的每一位存储到bitSum中,并且对应的位相加
                int bit = array[i] & bitMask;
                if(bit!=0) {
                    bitSum[j]+=1;
                }
                bitMask = bitMask<<1;
            }
        }
        
        int result =0;
        for(int i=0;i<32;i++) {
            result = result<<1;
            result += bitSum[i]%3;
        }
        
        return result;
    }

    private static void test1() {
        int[] array = {1,1,1,4,5,4,4,2,2,2};
        System.out.println(findNumberAppearingOnce(array)); 
    }

    private static void test2() {

    }
    private static void test3() {

    }

}

コードリンク

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

おすすめ

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