劍指Offer36:陣列中只出現一次的數字
阿新 • • 發佈:2018-12-26
思路:
可以用位運算實現,如果將所有數字相異或,則最後的結果肯定是那兩個只出現一次的數字異或
的結果,所以根據異或的結果1所在的最低位,把數字分成兩半,每一半里只有只出現一次的一個數據和成對出現的資料,然後將只出現一次的一個數據分別找出。
# -*- coding:utf-8 -*- class Solution: # 返回[a,b] 其中ab是出現一次的兩個數字 def FindNumsAppearOnce(self, array): # write code here if len(array)<=0: return [] num=self.xor(array) i=0 for i in range(32): if num&1==1: break else: num=num>>1 num1=[] num2=[] for arr in array: if self.bitis1(arr,i): num1.append(arr) else: num2.append(arr) first=self.xor(num1) second=self.xor(num2) return [first,second] def xor(self,arr): result=0 for i in arr: result=result^i return result def bitis1(self,n,i): n=n>>i return n&1
python大法,但是時間久我覺得。
# -*- coding:utf-8 -*- class Solution: # 返回[a,b] 其中ab是出現一次的兩個數字 def FindNumsAppearOnce(self, array): # write code here #tmp = set() tmp = [] for a in array: if a in tmp: tmp.remove(a) else: tmp.append(a) return tmp