【劍指offer】陣列中只出現一次的數字
阿新 • • 發佈:2018-12-11
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