96.只出现一次的数字

1 阅读1分钟

题目链接

给你一个 非空 整数数组 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)