给你一个 非空 整数数组
nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
解法 位运算
思路
最简单的肯定是哈希表计数,但是不能达到常量空间的要求,只能思考别的方法。
这里所有其他数字都出现了两次,我们是不是可以用这个两次做文章。在位运算当中,两个相同的数做异或运算会得到 0 ,而同 0 做异或运算会得到自己。
a ^ a = 0
a ^ 0 = a
成对的数会抵消成 0,只剩下那一个只出现一次数。
代码
function singleNumber(nums: number[]): number {
let res = 0;
for (let num of nums) {
res ^= num;
}
return res;
};
时空复杂度
时间复杂度:O(n)
空间复杂度:O(1)