LeetCode 260. Single Number III

题目

260. Single Number III

思路

先把全部的数异或一次,得到的是A^B
找到A^B的最低一位为1的位,这一位表示A和B在这位上不一样,一个为0,一个为1
再次遍历数组,分别将该位是0,该位是1的数分两组异或
最后得到的两个数就是了。

扩展

如果有四个数不同,那么是不能用这种方法的,比如
000 ^ 011 ^ 010 ^ 101 = 000
这样根本不知道有几位相同,几位不同。

源代码

public int[] singleNumber(int[] nums) {
    int diff = 0;
    for (int num : nums) {
        diff ^= num; 
    }
    // pick one bit as flag
    int bitFlag = (diff & (~ (diff - 1)));
    int[] res = new int[2];
    for (int num : nums) {
        if ((num & bitFlag) == 0) {
            res[0] ^= num;
        } else {
            res[1] ^= num;
        }
    }
    return res;
}

你可能感兴趣的:(LeetCode)