题目描述
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
示例 1:
输入:nums = [3,4,3,3]
输出:4
示例 2:
输入:nums = [9,1,7,9,7,9,7]
输出:1
解题思路1: Map法
示例代码: 略
解题思路2: 位运算法 K神题解
- 我们将每个数都变成二进制位, 将每个二进制位的1/0进行相加存储起来
- 将每个二进制位的和对3取余, 那么所有出现三次的二进制位就会变成0
- 剩下的为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)