写在最前面:除了介绍这道题本身以外,会讲一讲python中的异或
leetcode【165】Single Number
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,1] Output: 1Example 2:
Input: [4,1,2,1,2] Output: 4这道题用^比较方便,首先介绍一下^
下面看两个数:
a = 60
b = 13
a ^ b = 49
0011 1100 0000 1101 0011 0001^ 的原理是相同为0,相异为1
那么根据这个原理,0和任何数异或,要么是0,要么是任何数本身,所以这个性质决定了只有0能作为初始进行异或的数
由于题目给定的列表只包含唯一一个只出现一次的数,我们的目的是找到它
大家还应该知道一个重要的常识,^ 是有交换律的
a = [3,2,7,6,6,4,3,2,7,4] b = [3,2,6,6,7,4,3,2,7,4] res = 0 ses = 0 for i in range (len(a)): res ^= a[i] for i in range (len(b)): ses ^= b[i] print(res,ses) 0 0而且成对出现的数,不管你怎么打乱顺序,最后结果一定是0
我们用0先和第一个异或,为什么不用其他数,因为要保证从第一个列表中的数开始异或
假设列表[a,c,b,a,d,c,b]遍历异或后实际上是进行这样的运算:
a ^ c ^ b ^ a ^ d ^ c ^ b
交换异或即
(a ^ a) ^ (b ^ b) ^ (c ^ c) ^ d
0和那个唯一的数异或还是本身,所以最后return了那个唯一的数
我看了下网上对这样操作的原理讲的都不清不楚,作为一个较真的博主,我还是希望能把我写的东西明明白白的告诉大家,才对得起原创二字
下面是解题代码:
class Solution: def singleNumber(self, nums): """ :type nums: List[int] :rtype: int """ length = len(nums) res = 0 for i in range(length): res ^= nums[i] return res今天就到这儿,满足
