数组中数字出现的次数

题目一:数组中只出现一次的2个数字

一个整型数组里除了两个数字外,其他数字都出现了2次,清编写程序找出来这2个数字,要求时间复杂度为O(n),空间复杂度为O(1)。

思路:本题对时间复杂度要求,如果没有要求可以用以往的方法,先pop,然后在in判断,这里采用了位运算--异或。

1 先把数组中的每个元素异或,最后得到的是要找的2个数字的异或结果,因为相同数字异或结果为0

2 根据异或结果中的为1的位将数组中的数字分为2个类,他们每组只包含一个出现次数为1次的数

3 再将每个组异或就可以得到这2个数字了

class Solution:
    def xor(self,L):
        if L is None:
            return None
        
        result_xor = 0
        for i in L:       #数组异或得到result_xor
            result_xor = result_xor ^ i

        #找第一个1
        indexOf1 = self.find_first1(result_xor)
        n, m = 0, 0 
        for i in L:
            if self.IsBit(i, indexOf1):
                n = n ^ i
            else:
                m = m ^ i
        return n, m
        
    def IsBit(self, num, inde_bit):
        num = num >> inde_bit
        return num & 1

    def find_first1(self, result):
        index = 0
        while result & 1 == 0:
            
            result = result >> 1
            index += 1
        return index
    

            

题目2:数组中唯一出现一次的数字

在一个数组里除了一个数字出现一次之外,其他数字都出现了3次,请找出出现一次的数字

思路:把每个数字用二进制表示,然后将各位加起来,对应的位数能被3整除就可以,不能被3整除的就是最后要得到的数字

class Solution:
    def appear1(self, L):
        if L is None:
            return None
        bitSum = list(range(28*4))
        for i in L:
            bitMask = 1
            for j in range(28*4):
                bit = i & bitMask
                if bit != 0:
                    bitSum[111-j] += 1
                bitMask = bitMask << 1
        result = 0
        for i in range(112):
            result = result << 1
            result = bitSum[i]%3
        return result
            
    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值