1. 程式人生 > >leetcode【165】Single Number(關於異或)

leetcode【165】Single Number(關於異或)

寫在最前面:除了介紹這道題本身以外,會講一講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
                        

今天就到這兒,滿足