ソードフィンガーオファーインタビュー質問56:数値が配列に表示される回数(ビット演算、レビュー)

この質問については、アイデアはありません。答えのアイデアを直接見てください。答えのアイデアは

2つの同じ数値のXORは0であるため、すべての数値のXORは2つの異なる数値のXORです。その中で、XOR値の最初のビットは1であり、これを表します。

したがって、このビットが1か0かに応じて、配列を除算し、2つの配列を除算すると、2つの配列に1つの数値のみが表示され、すべての数値に対して排他的論理和演算を実行して2つの数値を見つけます。

 

知識のポイント:

ビット単位および、ビットシフト左

int div = 1;
while((div&res)==0){
    div<<=1;
}

XOR

a ^ b

ビット単位のAND、1は左にシフトされ、0であるかどうかは判断できますが、1であるかどうかは判断できません。同時に、1が必ずしも最下位ビットにあるとは限らないためです。

 

回答コード

    public int[] singleNumbers(int[] nums) {
        int res = 0;
        for(int count = 0;count<nums.length;count++){
            res ^= nums[count];
        }
        int div = 1;
        while((div& res) == 0){
            div<<=1;
        }
        int a = 0;
        int b = 0;
        for(int count = 0;count<nums.length;count++){
            if((nums[count]&div) == 0){
                a ^= nums[count];
            }else{
                b ^= nums[count];
            }
        }
        return new int[]{a,b};
    }

 

おすすめ

転載: blog.csdn.net/qq_40473204/article/details/115009038