题目描述:一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是 O(n),空间复杂度是 O(1)。
这题和下面两题类似,要想 O(1) 的空间复杂度,就得用位运算:
解题的关键是:用异或运算,将数组分成两个子数组,然后对于子数组来说,就回到了 leetcode136 这题的解题思路。
整体的算法流程是:
代码实现如下:
// ac地址:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/
// 原文地址:https://xxoo521.com/2020-03-25-single-numbers/
/**
* @param {number[]} nums
* @return {number[]}
*/
var singleNumbers = function(nums) {
let tmp = 0;
for (let num of nums) {
tmp = tmp ^ num;
}
let bit = 0;
let mask = 1;
while ((mask & tmp) === 0) {
mask = mask << 1;
++bit;
}
let res1 = 0,
res2 = 0;
for (let num of nums) {
if (num & mask) {
res1 = res1 ^ num;
} else {
res2 = res2 ^ num;
}
}
return [res1, res2];
};