260. Single Number III

在一堆出现二的数字中返回两个只出现一次的数字。

Input:  [1,2,1,3,2,5]
Output: [3,5]

使用two sum的方法异或,慢慢

public int[] singleNumber(int[] nums) {
    int sum = 0;
    Set<Integer> set = new HashSet<>();
    for (int num : nums) {
        set.add(num);
        sum ^= num;
    }
    for (int num : nums) {
        int other = sum ^ num;
        if (set.contains(other)) return new int[] {num, other};
    }
    return null;
}

所有的数字xor之后的二进制sum结果至少会有一位被置1,然后找到sum中最后一位被置1的位作为mask,然后使用这个mask遍历整个数组,计算res = mask ^ num,当res分别为0和其他数的时候,就可以把这两个数字筛选出来。

public int[] singleNumber(int[] nums) {
    int diff = 0;
    for (int num : nums) {
        diff ^= num;
    }

    int mask = (diff & -diff);

    int[] res = new int[2];
    for (int num : nums) {
        if ((num & mask) == 0) { 
            res[0] ^= num;
        } else {
            res[1] ^= num;
        }
    }
    return res;
}

results matching ""

    No results matching ""