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

题目

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
示例 1:
输入:nums = [3,4,3,3] \quad 输出:4
示例 2:
输入:nums = [9,1,7,9,7,9,7] \quad 输出:1
限制:
1 <= nums.length <= 10000 \quad 1 <= nums[i] < 2^31

解法一: 哈希表

用哈希表来保存数字出现的次数,时间复杂度 O(n), 空间复杂度O(n)


class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        Hash = {}
        for num in nums:
            if num in Hash:
                Hash[num] += 1
            else:
                Hash[num] = 1
        Res = 0
        for num in nums:
            if Hash[num] == 1:
                Res = num 
        return Res

解法二:位运算

reference

  1. 如果某个数字出现3次,那么这个3个数字的和肯定能被3整除,则其对应二进制位的每一位的和也能被3整除
  2. 统计数组中每个数字的二进制中每一位的和,判断该和是否能被3整除。
  3. 若可以,则只出现一次的数字的二进制数中那一位为0,否则为1。
class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        Res = 0
        for i in range(32):
            cnt = 0
            for num in nums:
                if num & (1 << i):
                    cnt += 1
            if cnt % 3 == 1:
                Res = Res | (1 << i)
        return Res

这种方法可以用来解决一个数出现一次,其他数出现k次的问题。时间复杂度O(n), 空间复杂度O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值