136. 只出现一次的数字

  • 题目: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

  • 例如:

    输入: [2,2,1]
    输出: 1
    
    输入: [4,1,2,1,2]
    输出: 4
    

异或运算的性质

  1. 异或的基础运算

\[a\oplus a = 0 \]

\[a\oplus 0 = a \]

\[a\oplus a \oplus b = 0 \oplus b = b \]

  1. 异或运算满足交换律、结合律

\[a\oplus b \oplus a = a\oplus a \oplus b = 0 \oplus b = b \]

异或在本题中的应用

出现两次的元素在异或后会变为00与出现一次的元素异或则为该元素本身
由于异或运算满足交换律,所以元素出现顺序并不影响最终结果。

代码

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
posted @ 2022-03-30 09:59  ArdenWang  阅读(16)  评论(0编辑  收藏  举报