136. 只出现一次的数字

难度:简单 | 主题:数组、位运算

题目

给你一个非空整数数组 nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。要求实现线性时间复杂度的解法,且不使用额外空间。

示例

 
输入:nums = [2,2,1]
 
输出:1
 

思路

先讲个故事:找落单的人

公司团建,所有人两两配对合影。突然发现有一个人落单了——没人跟他合照。你不会逐个问”你跟谁拍的”——你让所有人两两握手,配成对的就消掉了,最后剩下的那个就是落单的。

这就是异或运算:a ^ a = 0(成对消掉),a ^ 0 = a(落单保留)。


引导式推导:异或的魔法

把所有数异或一遍,出现两次的全抵消为 0,剩下的就是只出现一次的数。


graph LR

    A["全部异或"] --> B["a ^ a = 0<br/>成对消掉"]

    B --> C["0 ^ x = x<br/>落单保留"]

    C --> D["结果 = 只出现一次的数"]

方法时间空间
异或O(n)O(1)
哈希表O(n)O(n)
排序O(n log n)O(1)

代码

 
def singleNumber(self, nums):
 
    res = 0
 
    for num in nums:
 
        res ^= num
 
    return res
 

一行版:reduce(lambda x, y: x ^ y, nums)


复杂度

指标解释
时间O(n)遍历一次数组
空间O(1)只用一个变量

实战考量

频率分析

出现在:位运算经典题。常见,是位运算类题目的入门必会。几乎所有公司一面都会考。

延伸思考

Q:为什么异或能找出单身元素?

A:异或本质是「无进位加法」,检测奇偶次出现。a ^ a = 0(成对抵消),a ^ 0 = a(单身保留)。交换律和结合律保证顺序不影响结果。

Q:如果两个元素出现一次,其他出现两次呢?(260 题)

A:全部异或后得到 x ^ y(两个单身元素的异或)。取 x ^ y 的最低位 1 作为分组标志,将数组分成两组分别异或,每组得到各自的单身元素。

Q:如果一个元素出现一次,其他出现三次呢?(137 题)

A:用「三进制」思想,统计每个二进制位出现的次数,模 3 取余后拼成结果。

Q:异或运算有哪些性质?

A:① a ^ a = 0(自反性);② a ^ 0 = a(恒等性);③ 交换律;④ 结合律。

易错点

  • res 初始化为 0 不是 None

  • 一行 reduce(lambda x, y: x ^ y, nums) 实践中不如循环直观


生活类比

异或消对 → 两人互相抵消

想象一个房间里每个人都有一个双胞胎,大家互相找配对。找到双胞胎的两人一起离开房间。最后剩下来的那个人——就是没有双胞胎的落单者。异或运算就是这个”配对消消乐”的数学版本。


相关题目

题目关系
268丢失的数字同族异或应用
287寻找重复数位运算 + 快慢指针
202快乐数数学类

→ 返回题单:LeetCode学习路线图 > 十四、数学与位运算

速记卡(面试闪卡)

Q1:一句话讲清「136. 只出现一次的数字」到底是什么?

A:只出现一次的数字,是其余都成对、唯独一个落单,用异或一遍扫就揪出来。

Q2:题目与直觉 —— 怎么理解?

A:数组里除一个元素外其余都出现两次,线性时间、不用额外空间找出它。就像公司团建两两合影,最后没配对、落单的那个人就是答案(single number)。

Q3:核心思路——异或消对 —— 怎么理解?

A:把所有数异或一遍,出现两次的全抵消为 0,只剩落单的。好比房间里每人找双胞胎,配成对的拉走,剩下来的就是没双胞胎的(XOR)。

Q4:异或的魔法性质 —— 怎么理解?

A:a^a=0(自反)、a^0=a(恒等),再加交换律结合律,顺序随便排。异或是”无进位加法”,专治奇偶次出现(bitwise XOR)。

Q5:复杂度与变体 —— 怎么理解?

A:时间 O(n) 一遍过,空间 O(1) 只用一个变量。进阶:两个落单用最低位 1 分组,三个落单用三进制统计(time/space complexity)。

Q6:核心速记主线有哪些?

  • 本质:异或 a^a=0 成对消,a^0=a 落单留

  • 写法:res 初始 0,循环 res ^= num

  • 进阶:两落单按最低位 1 分组再异或

  • 复杂度:时间 O(n),空间 O(1)

口诀

A:团建合影找落单,异或消对剩自己;

a^a 归零 a^0 留,无进位加显神技;

一遍扫过 O(n) 快,不占内存省力气;

两个单身分组破,三进统计也破题。

相关链接