数组中只出现一次的数字

题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解题思路:
这道题我们需要先从它的简化版本看,假如一个数组中除了一个数字出现一次,其它数字都出现两次,找出这个数字。
我们可以考虑用异或的方法去做,为什么呢?
首先,异或满足交换律,即1^2^3=3^2^1=2^1^3=2^3^1=1^3^2=3^1^2。
同时,如果一个数字与自己异或等于0,而一个数字与0异或等于自己。
即假如数组是a,b,c,b,a,那么a^b^c^b^a=a^a^b^b^c=0^0^c=c。
所以代码如下:

import functools
class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def FindNumsAppearOnce(self, array):
        # write code here
        return functools.reduce(lambda x,y:x^y ,array)

而有两个只出现一次的数字呢?
最后的异或结果必为两个数字的异或,因为两个数字不同,所以结果必不为0,那么这个结果的二进制就有一位是1,那么这两个数字的二进制在这一位必定一个是1,一个是0,那么我们根据这一位是1还是0来划分数组,因为相同的数字必定会划分到同一个数组,而这两个数字必定会划分到不同的数组,那么新的数组除了各自只出现一次的数字,其余数字都是两两相同的,那么就分解成上面的问题了。
代码:

import functools
class Solution:
    def FindNumsAppearOnce(self, array):
        if not array: return []
        temp = functools.reduce(lambda x, y: x ^ y, array)
        index = 0
        while temp & 1 == 0:
            temp =temp >> 1
            index+=1
        x=y=0
        for i in array:
            if (i>>index & 1) == 0 :
                x^=i
            else:
                y^=i
        return [x,y]

当然,我们也可以用hashmap的方法来做,这里就不赘述了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值