给你一个非空整数数组
nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
题目要求线性时间复杂度,空间复杂度为常量,而且规定除了某个元素出现1次外,其他均出现2次。
首先使用普通解题方法哈希表:
class Solution: def singleNumber(self, nums: List[int]) -> int: if not nums: return -1 res = {} for i in range(len(nums)): if nums[i] in res: res[nums[i]] = res[nums[i]] + 1 continue res[nums[i]] = 1 for key, value in res.items(): if value == 1: return key上面方法对于空间复杂度不满足要求,但是是一种容易想到的方式,下面的这种不容易想到就是异或运算。由于其他元素都出现2次,所以这些元素异或最终为0,再和出现1次的元素异或,最后就是出现1次的元素值。
异或运算(
^)是二进制运算,满足以下 3 条性质,是解决「只出现一次数字」的核心:
- 自身异或为 0:
a ^ a = 0(比如 5^5=0,二进制 101^101=000);- 异或 0 为自身:
a ^ 0 = a(比如 5^0=5,二进制 101^000=101);- 交换律和结合律:
a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c(顺序不影响结果)。
class Solution: def singleNumber(self, nums: List[int]) -> int: res = 0 for num in nums: res ^= num return res