136. 只出现一次的数字

136. 只出现一次的数字

题目链接:136. 只出现一次的数字

题目描述

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

核心思考:位运算(异或)

题目要求线性时间复杂度和常数的额外空间,这排除了使用哈希表或排序的思路,将解题方向指向了位运算中的**异或(XOR)**操作。

异或运算($\oplus$)具有以下特性:

  1. 任何数和 0 进行异或运算,结果等于它本身:$a \oplus 0 = a$
  2. 任何数和它本身进行异或运算,结果等于 0:$a \oplus a = 0$
  3. 异或运算满足交换律和结合律:$a \oplus b \oplus a = (a \oplus a) \oplus b = 0 \oplus b = b$

已知数组中除了一个数字是单独出现,其余元素全部都是成对出现。利用异或的特性,将数组中所有元素依次进行异或运算,成双成对出现的数字就会相互抵消归零,最终遗留下来的结果就是那个唯一不重复的数字。
在 Python 语言中,可通过 reduce 与运算符 xor 一行实现该过程。

解题思路 (Python)

1
2
3
4
class Solution:
def singleNumber(self, nums: List[int]) -> int:
return reduce(xor, nums)

复杂度分析

  • 时间复杂度:$O(N)$,其中 $N$ 为数组长度。只需要遍历一次数组。
  • 空间复杂度:$O(1)$,无需额外的内存空间分配,直接聚合。