题目
在一个数组 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
解法二:位运算
- 如果某个数字出现3次,那么这个3个数字的和肯定能被3整除,则其对应二进制位的每一位的和也能被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)。