思路
使用集合来存储数,遍历的时候集合里没有加入这个数,有就删去这个数,这样最后集合中的一个元素就是最终的结果。但是采用了O(n)的空间复杂度。
要使用常数的额外空间,可以采用位运算当中的异或,两个相同的数异或为0,一个数和0异或为其自身,并且满足交换率。
代码
function singleNumber(nums: number[]): number {
// 这种做法使用了O(n)的额外空间
const set = new Set<number>();
let cur;
for(let i = 0; i <= nums.length; i++) {
cur = nums[i];
if (set.has(cur)) set.delete(cur);
else set.add(cur);
}
return set.values().next().value;
}
function singleNumber_xor(nums: number[]): number {
// 常数空间复杂度
let single: number = 0;
for(let i = 0; i <= nums.length; i++) {
single ^= nums[i];
}
return single;
}
console.log(singleNumber_xor([3, 3, 1]));