剑指刷题-面试题56 - II. 数组中数字出现的次数 II

题目:
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
在这里插入图片描述
解法
解法一:循环遍历
思想:循环遍历,取出的每个数字分别与列表里的所有数字比较,有相同的就加一。统计count,如果count为1就打印出x。如果不是就说明不是想要的数字用continue跳出内循环。

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        for x in nums:
            count=0
            for y in nums:
                if x==y:
                    count=count+1
            if count == 1:
                return x
            else:
                continue

解法二:二进制取余法
思想:
统计所有数字二进制位的和
判断每一位的和能否被3整除,求解最后结果
在这里插入图片描述

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        bitSum = [0] *32 #定义存储各个位的数组

        for i in nums: #统计各位之和
            mask = 1
            # 一位一位的判断,从最后一位开始,
            # reversed(range(32)) ---[31,,,0]
            for j in reversed(range(32)):
                # 位上如果为1就会mask与之后为1
                if mask & i:
                    bitSum[j] += 1
                mask = mask << 1
		# 每位分别去% 3,得到的数就是result
        result = 0
        for i in range(32):# 得到最终结果
            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、付费专栏及课程。

余额充值