天天看點

*LeetCode-Single Number III

這個題是有兩個數字出現一次 剩下的全都出現兩次

方法是先找到這兩個數的xor 即全都xor到一起

然後找到這個xor的最後一位置位的位置(為1 的那位) 說明這一位上 這兩個數字不同 

得到這個last set bit的方法是 num &= - num 一個數的complement 是-num。 一個數和它的補碼and 就會得到 last set bit

然後 設定兩個累加的xor 假如一個數和這個last set bit 一緻 就xor到一個上面 假如不一緻 就xor到另一個上面 這樣這兩個出現一次的數字就能被分開了

public class Solution {
    public int[] singleNumber(int[] nums) {
        int xor = 0;
        for ( int i = 0; i < nums.length; i ++ ){
            xor ^= nums[i];
        }
        xor &= -xor;
        int group1 = 0;
        int group2 = 0;
        for ( int i = 0; i < nums.length; i ++ ){
            if ( (nums[ i ] & xor) == 0 )
                group1 ^= nums[ i ];
            else
                group2 ^= nums[ i ];
        }
        int [] res = new int [ 2 ];
        res [ 0 ] = group1;
        res [ 1 ] = group2;
        return res;
    }
}