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

劍指Offer36:陣列中只出現一次的數字

思路:

可以用位運算實現,如果將所有數字相異或,則最後的結果肯定是那兩個只出現一次的數字異或
 的結果,所以根據異或的結果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