剑指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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值