leetcode【165】Single Number(關於異或)
阿新 • • 發佈:2018-11-01
寫在最前面:除了介紹這道題本身以外,會講一講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: 1
Example 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
今天就到這兒,滿足