给你一个 非空 整数数组
nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
题目要求线性时间复杂度,空间复杂度为常量,而且规定除了某个元素出现1次外,其他均出现2次。
首先使用普通解题方法哈希表:
python
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(顺序不影响结果)。
python
class Solution:
def singleNumber(self, nums: List[int]) -> int:
res = 0
for num in nums:
res ^= num
return res