牛客网-数组只出现一次的数字(异或)

题目描述:

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

自己提交代码:

# -*- coding:utf-8 -*-
class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def FindNumsAppearOnce(self, array):
        # write code here
        result = []
        for num in array:
            if num not in result:
                result.append(num)
            else:
                result.remove(num)
        return result

 提升代码:

对所有元素进行异或,结果是两个无重复数字的异或和。(相同数字的异或值为0)。因此根据异或结果将这两个数字分开(根据异或结果第一个为1的位数,将此位都为1的放一起,不为1的放一起,然后对这两组进行异或可以分别得到这两个没有重复的数字)。

class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def FindNumsAppearOnce(self, array):
        # write code here
        if len(array)==2:
            return array
        temp = 0
        for i in array:
            temp ^= i
        index = self.FindFrist(temp)
        a,b=0,0
        for num in array:
            if self.bitFind(num,index)==1:
                a ^= num
            else:
                b ^= num
        return [a,b]
    def FindFrist(self,temp):
        index = 0
        while(temp&1==0 and index<32):
            temp >>= 1
            index += 1
        return index
    def bitFind(self,temp,index):
        temp >>= index
        return 1 if temp&1==1 else 0
posted @ 2020-01-03 17:49  ditingz  阅读(273)  评论(0编辑  收藏  举报