剑指 Offer 56 - I. 数组中数字出现的次数python

题目描述:

题解一:dict

1.利用list result保存最终只出现一次的两个数字,numsdict记录nums每个数字num出现的次数。

2.遍历nums,如果当前num不在numsdict中,说明num是只出现一次的数字,或者是出现两次数字的第一次,将num加入result,然后numsdict[num]设置为1。如果num在numsdict中,说明num已经在数组中出现第二次,如果之前num加入了result,则将num从result去掉。

class Solution:
    def singleNumbers(self, nums: List[int]) -> List[int]:
        numsdict = {}
        result = []
        for num in nums:
            if num in numsdict:
                if num in result:
                    result.remove(num)
            else:
                numsdict[num]=1
                result.append(num)
        return result

 题解二:位运算

1.a^a=0 a^0=a,即一个数和自身做异或结果为0,一个数和0做异或操作结果为自身。

2.数组nums中所有数字做异或,出现两次的数字结果亦或结果均为0,因此nums中所有数字的异或结果ret为其中只出现一次的两个数字的异或结果。

3.找到ret中为1的位置idx,将nums中数字按照idx为0和为1,分为两组。

4.因为两个只出现一次的数字不同,所以这两个数字的第idx位不同。因此第一组数字为:一个出现一次的数字+若干对出现两次的数字,第二组:另一个只出现一次的数字+若干对出现两次的数字。

5.对第一组所有数字做异或结果为第一个只出现一次的数字,第二组所有数字做异或,结果为第二个只出现一次的数字。

class Solution(object):
    def singleNumbers(self, nums):
        ret = 0
        idx = 0 
        for n in nums:
            ret^=n
        while ret&1==0:
            idx = idx+1
            ret = ret>>1
        r1 = 0
        r2 = 0
        for n in nums:
            if (n>>idx)&1==0:
                r1^=n
            else:
                r2^=n
        return [r1,r2]

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值