数组中只出现一次的两个数字

题目描述

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

输入输入示例

输入:[1,4,1,6]
返回值:[4, 6]
说明:
返回的结果中较小的数排在前面

代码示例

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param array int整型一维数组 
# @return int整型一维数组
#
class Solution:
    def FindNumsAppearOnce(self , array ):
        # write code here
        if len(array) < 2:
            return None
        
        # 遍历数组,将所有数组中的数进行异或
        # twoNumXor表示为数组异或后的值
        twoNumXor = None
        for num in array:
            if twoNumXor == None:
                twoNumXor = num
            else:
                twoNumXor = twoNumXor ^ num
        # 因为数组中只有两个数字只出现一次,所以此时异或的结果是这两个数字的异或结果
        
        # 查找异或结果中最右边的1
        count = 0
        # 例:twoNumXor == 0110=6
        while twoNumXor % 2 == 0:
            # twoNumXor = twoNumXor // 2
            twoNumXor = twoNumXor >> 1
            # twoNumXor ==> 0011
            count += 1
        # 只保留最右边的第一个1  count=1
        # 1 << 1---->  10
        mask = 1 << count
    
        firstNum = None
        secondNum = None
        # 此时用mask(10)与数组中的每一个数进行与&操作
        for num in array:
            # 与的结果分两种,一种是0,一种是1
            if mask & num == 0:
                # 0的情况的数为一组并进行异或,异或后的结果为出现一次的数
                if firstNum == None:
                    firstNum = num
                else:
                    firstNum = firstNum ^ num
            # 1的情况的数为一组并进行异或,异或后的结果为另一个出现一次的数
            else:
                if secondNum == None:
                    secondNum = num
                else:
                    secondNum = secondNum ^ num
        if firstNum <= secondNum:
            return firstNum, secondNum
        else:
            return secondNum, firstNum
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值