136. 只出现一次的数字给定一个 非空 整数数组 ,除了某个元素只出现一次 以外,其余每个元素均出现两次。请你找出那个只出现了一次的元素。你的算法应具有 线性时间复杂度 O(n)。你可以不运用额外空间来达成吗?? 错误方法:使用 (不符合题意) ❌ 存在问题: 时间复杂度是 ,但…空间复杂度是 O(n),启用了哈希表统计每个元素频次不符合“只应用常数额外空间”的限制条件即:因

136. 只出现一次的数字

? 题目描述

给定一个 非空 整数数组 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.CounterO(n)O(n)❌ 空间不符合
异或运算O(n)O(1)✅ 完美符合

posted @ 2025-07-30 11:02  yfceshi  阅读(8)  评论(0)    收藏  举报