直接回答:对所有元素做异或(XOR)累积。异或满足交换律、结合律,且 a ^ a = 0、a ^ 0 = a,因此成对出现的数全部抵消,最后剩下的就是那个只出现一次的数。时间 O(n),空间 O(1)。
展开解析:这题的关键是识别「成对抵消」与异或性质的对应关系,先排序再找(O(n log n))或哈希计数(O(n) 空间)都不算达标答案。它的变体是面试常客:1)两个数只出现一次、其余两次——整体异或得到 x ^ y,取结果中任意一个为 1 的位(两数在该位不同)把数组分成两组分别异或,即得 x 和 y;2)其余数都出现三次——异或失效,改用「逐位计数 mod 3」:统计每一位上 1 的个数,模 3 余数即为答案在该位的值;3)进阶追问是把这些统一看作「有限域上的消元」,以及为什么浮点数、字符串不能直接套异或(需要先映射到整数编码)。
示例:
def single_number(nums):
result = 0
for x in nums:
result ^= x
return result