1. 程式人生 > >【劍指offer】陣列中只出現一次的數字

【劍指offer】陣列中只出現一次的數字

remove:刪除特定元素第一次出現的時候,返回的是刪除後的陣列

del:刪除指定索引的元素 del a[2],返回的是刪除後的陣列

pop:刪除指定索引的元素,返回的是刪除的元素

有一個問題就是我不知道判斷not in list 的時候O(n)的複雜度會不會影響

執行時間:36ms

佔用記憶體:5624k

# -*- coding:utf-8 -*-
class Solution:
    # 返回[a,b] 其中ab是出現一次的兩個數字
    def FindNumsAppearOnce(self, array):
        # write code here
        res = []
        while(array):
            temp = array[0]
            array.pop(0)
            if (temp not in array):
                res.append(temp)
            else:
            	array.remove(temp)
        return res

------------------------

一直忍著沒用Counter

標準思路是異或想法

首先:位運算中異或的性質:兩個相同數字異或=0一個數和0異或還是它本身

只有一個數出現一次時,我們把陣列中所有的數,依次異或運算,最後剩下的就是落單的數,因為成對兒出現的都抵消了。

依照這個思路,我們來看兩個數(我們假設是AB)出現一次的陣列。我們首先還是先異或,剩下的數字肯定是A、B異或的結果,這個結果的二進位制中的1,表現的是A和B的不同的位。我們就取第一個1所在的位數,假設是第3位,接著把原陣列分成兩組,分組標準是第3位是否為1。如此,相同的數肯定在一個組,因為相同數字所有位都相同,而不同的數,肯定不在一組

。然後把這兩個組按照最開始的思路,依次異或,剩餘的兩個結果就是這兩個只出現一次的數字。

連結:https://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811
來源:牛客網

class Solution:
    def FindNumsAppearOnce(self, array):
        if not array:
            return []
        # 對array中的數字進行異或運算
        tmp = 0
        for i in array:
            tmp ^= i
        # 獲取tmp中最低位1的位置
        idx = 0
        while (tmp & 1) == 0:
            tmp >>= 1
            idx += 1
        a = b = 0
        for i in array:
            if self.isBit(i, idx):
                a ^= i
            else:
                b ^= i
        return [a, b]
 
    def isBit(self, num, idx):
        """
        判斷num的二進位制從低到高idx位是不是1
        :param num: 數字
        :param idx: 二進位制從低到高位置
        :return: num的idx位是否為1
        """
        num = num >> idx
        return num & 1