136. 只出现一次的数字给定一个 非空 整数数组 ,除了某个元素只出现一次 以外,其余每个元素均出现两次。请你找出那个只出现了一次的元素。你的算法应具有 线性时间复杂度 O(n)。你可以不运用额外空间来达成吗?? 错误方法:使用 (不符合题意) ❌ 存在问题: 时间复杂度是 ,但…空间复杂度是 O(n),启用了哈希表统计每个元素频次不符合“只应用常数额外空间”的限制条件即:因
? 题目描述
给定一个 非空 整数数组 nums
,除了某个元素只出现一次 以外,其余每个元素均出现两次。
请你找出那个只出现了一次的元素。
➤ 进阶要求:
你的算法应具有 线性时间复杂度 O(n)。
你可以不使用额外空间来实现吗?
? 示例
输入: nums = [2,2,1]
输出: 1
输入: nums = [4,1,2,1,2]
输出: 4
输入: nums = [1]
输出: 1
? 错误方法:使用 collections.Counter
(不符合题意)
class Solution:
def singleNumber(self, nums: List[int]) -> int:
ans = collections.Counter(nums)
min_item = ans.most_common()[-1][-2]
return min_item
❌ 存在问题:
时间复杂度是
O(n)
,但…空间复杂度是 O(n),使用了哈希表统计每个元素频次
不符合“只使用常数额外空间”的限制条件
✅ 正确解法:位运算 XOR(异或)
? 核心思想
一个数和自己异或为 0,一个数和 0 异或为它本身。
即:
a ^ a = 0
a ^ 0 = a
因此,若所有元素都出现两次,只有一个数出现一次,对所有元素进行异或操作,最后剩下的就是那个只出现一次的数字。
? Python 代码(最优解)
class Solution:
def singleNumber(self, nums: List[int]) -> int:
ans = 0
for num in nums:
ans ^= num # 使用异或操作消去成对数字
return ans
? 示例演示:输入 nums = [4, 1, 2, 1, 2]
初始 ans = 0
步骤:
ans ^ 4 => 0 ^ 4 = 4
ans ^ 1 => 4 ^ 1 = 5
ans ^ 2 => 5 ^ 2 = 7
ans ^ 1 => 7 ^ 1 = 6
ans ^ 2 => 6 ^ 2 = 4
最终 ans = 4
⏱️ 时间复杂度 & 空间复杂度
项目 | 复杂度 |
---|---|
时间复杂度 | O(n) |
空间复杂度 | O(1) ✅ 常数空间 |
? 小结
解法 | 时间复杂度 | 空间复杂度 | 是否符合题意 |
---|---|---|---|
collections.Counter | O(n) | O(n) | ❌ 空间不符合 |
异或运算 | O(n) | O(1) | ✅ 完美符合 |