我是靠谱客的博主 能干大山,最近开发中收集的这篇文章主要介绍剑指offer:数组中只出现一次的数字(python),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目位置

题目描述

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

思路1:遍历

class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def FindNumsAppearOnce(self, array):
        # write code here
        dict = {}
        list = []
        for i in array:
            if i in dict:
                dict[i] += 1
            else:
                dict[i] = 1
                
        for key,value in dict.items():
            if value == 1:
                list.append(key)
        return list

思路2:按位运算

两个不相等的元素在位级表示上必定会有一位存在不同, 将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果。

据异或的结果1所在的最低位,把数字分成两半,每一半里都还有一个出现一次的数据和其他成对出现的数据, 问题就转化为了两个独立的子问题“数组中只有一个数出现一次,其他数都出现了2次,找出这个数字”。

    class Solution:
        # 返回[a,b] 其中ab是出现一次的两个数字
        def FindNumsAppearOnce(self, array):
            # write code here
            ans,a1,a2,flag= 0,0,0,1
            for num in array:
                ans = ans ^ num
            while(ans):
                if ans%2 == 0:
                    ans = ans >>1 
                    flag = flag <<1
                else:
                    break
            for num in array:
                if num & flag:
                    a1 = a1 ^ num
                else:
                    a2 = a2 ^ num
            return a1,a2

相关知识

& 按位与, | 按位或 , ^ 按位异或
AND (位与&) OR ( 位或| ) XOR ( 位异或^ )
1 & 1 = 1, 1 | 1 = 1, 1 ^ 1 = 0
1 & 0 = 0, 1 | 0 = 1, 1 ^ 0 = 1
0 & 1 = 0, 0 | 1 = 1, 0 ^ 1 = 1
0 & 0 = 0, 0 | 0 = 0, 0 ^ 0 = 0


<<      :     左移运算符,num << 1,相当于num乘以2
>>      :     右移运算符,num >> 1,相当于num除以2

最后

以上就是能干大山为你收集整理的剑指offer:数组中只出现一次的数字(python)的全部内容,希望文章能够帮你解决剑指offer:数组中只出现一次的数字(python)所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部