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

289 阅读1分钟

题目描述

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

示例 1:
输入:nums = [3,4,3,3]
输出:4

示例 2:
输入:nums = [9,1,7,9,7,9,7]
输出:1

解题思路1: Map法

示例代码: 略

解题思路2: 位运算法 K神题解

  1. 我们将每个数都变成二进制位, 将每个二进制位的1/0进行相加存储起来
  2. 将每个二进制位的和对3取余, 那么所有出现三次的二进制位就会变成0
  3. 剩下的为1的二进制位所组成的数就是出现一次的数

K神是用二进制实现自动状态机来处理每个二进制位, 实力有限, 我是直接实现了这个过程...

示例代码:

def singleNumber(self, nums: List[int]) -> int:
    bits = [0] * 34  # 声明一个数组用来存储二进制位的和
    for n in nums:
        bstr = str(bin(n))
        lstr = len(bstr)
        for i in range(2, lstr):  # 循环对每个二进制位进行相加
            bits[-(lstr - i)] += int(bstr[i])

    bitStr = "0"
    for i in range(2, len(bits)):
        bits[i] = bits[i] % 3  # 对3取余
        bitStr += str(bits[i])

    return int(bitStr, 2)