我是靠谱客的博主 超级柠檬,最近开发中收集的这篇文章主要介绍剑指 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]

 

 

最后

以上就是超级柠檬为你收集整理的剑指 Offer 56 - I. 数组中数字出现的次数python的全部内容,希望文章能够帮你解决剑指 Offer 56 - I. 数组中数字出现的次数python所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部