题目描述
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
代码片
/**
* @param {number[]} nums
* @return {number[]}
*/
var singleNumbers = function(nums) {
let ret = 0;
const len = nums.length;
//先对所有数字进行一次异或,得到两个出现一次的数字的异或值
for(let i = 0; i < len; i++) {
ret = ret ^ nums[i];
}
//此时ret是两个不同的数 异或的结果
//寻找div,div是ret最低位为1、其余位是0的二进制数
let div = 1;
while((ret & div) === 0) div = div << 1;//在异或结果中找到最右侧为1的位
let [a, b] = [0 ,0];
for(let i = 0; i < len; i++) {
//根据这一位对所有的数字进行分组。在每个组内进行异或操作,得到两个数字
if(nums[i] & div) {
a = a ^ nums[i];
} else {
b = b ^ nums[i];
}
}
return [a,b];
};