136. 只出现一次的数字
136. 只出现一次的数字
题目链接:136. 只出现一次的数字
题目描述
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
核心思考:位运算(异或)
题目要求线性时间复杂度和常数的额外空间,这排除了使用哈希表或排序的思路,将解题方向指向了位运算中的**异或(XOR)**操作。
异或运算($\oplus$)具有以下特性:
- 任何数和 0 进行异或运算,结果等于它本身:$a \oplus 0 = a$
- 任何数和它本身进行异或运算,结果等于 0:$a \oplus a = 0$
- 异或运算满足交换律和结合律:$a \oplus b \oplus a = (a \oplus a) \oplus b = 0 \oplus b = b$
已知数组中除了一个数字是单独出现,其余元素全部都是成对出现。利用异或的特性,将数组中所有元素依次进行异或运算,成双成对出现的数字就会相互抵消归零,最终遗留下来的结果就是那个唯一不重复的数字。
在 Python 语言中,可通过 reduce 与运算符 xor 一行实现该过程。
解题思路 (Python)
1 | class Solution: |
复杂度分析
- 时间复杂度:$O(N)$,其中 $N$ 为数组长度。只需要遍历一次数组。
- 空间复杂度:$O(1)$,无需额外的内存空间分配,直接聚合。