260. 只出现一次的数字 III(JS实现)

260. 只出现一次的数字 III(JS实现)
1 题目
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]
注意:
结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
链接:https://leetcode-cn.com/problems/single-number-iii
2 思路
这道用位运算很巧妙
计算 bitmask ^= x,则 bitmask 不会保留出现两次数字的值,因为相同数字的异或值为 0。
但是 bitmask 会保留只出现一次的两个数字(x 和 y)之间的差异,在通过 bitmask & (-bitmask) 保留 bitmask *右边的 1,这个1要么来自于x,要么来自于y,然后再通过一次遍历异或运算,得到其中一个数
3代码
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var singleNumber = function(nums) {
    let bitMask = 0;
    for (let num of nums) {
        bitMask ^= num;
    }
    let diff = bitMask & (-bitMask);
    let x = 0;
    for (let num of nums) {
        if (num & diff) {   //排除y
            x ^= num;
        }
    }
    return [x, bitMask^x];
};