136. 只出现一次的数字
-
题目: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
-
例如:
输入: [2,2,1] 输出: 1
输入: [4,1,2,1,2] 输出: 4
异或运算的性质
- 异或的基础运算
\[a\oplus a = 0
\]
\[a\oplus 0 = a
\]
\[a\oplus a \oplus b = 0 \oplus b = b
\]
- 异或运算满足交换律、结合律
\[a\oplus b \oplus a = a\oplus a \oplus b = 0 \oplus b = b
\]
异或在本题中的应用
出现两次的元素在异或后会变为0,0与出现一次的元素异或则为该元素本身。
由于异或运算满足交换律,所以元素出现顺序并不影响最终结果。
代码
class Solution:
def singleNumber(self, nums: List[int]) -> int:
return reduce(lambda x,y: x^y, nums)
reduce函数
- reduce(function,iterator)
- 工作原理:首先把iterator(list,tuple et al.)中的前两个元素传给function参数,函数加工后,把得到的结果和第三个元素作为两个参数传给函数参数,依次类推。
- 如果传入了 initial 值, 那么首先传的就不是 iterator 的第一个和第二个元素,而是 initial值和 第一个元素。经过这样的累计计算之后得到单一返回值
def add(x, y):
... return x+y
...
from functools import reduce
# 1+2=3
# 3+3=6
# 6+4=10
reduce(add, [1,2,3,4])
out: 10
from functools import reduce
# 1 * 10 + 2 = 12
# 12 * 10 + 3 = 123
# 123 * 10 + 4 = 1234
# ……
reduce(lambda x, y: x * 10 + y, [1, 2, 3, 4, 5])
out: 12345