在一个数组 nums
中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
示例 1:
输入:nums = [3,4,3,3]
输出:4
示例 2:
输入:nums = [9,1,7,9,7,9,7]
输出:1
1、题目分析
这个题的简单版本就是其它数字都出现了两次,找出出现一次的那个数字。这个比较简单明了,直接对数组中所有的元素进行与或运算就得了,但是对于出现三次就无法解决了。对于这个问题来说,可以有两种解决办法:①hash表②位运算;对于位运算我们可以看如下的图:
2、解题分析
- hash法
- 构造一个hash表,key是元素,value是元素出现的次数
- 遍历hash表,找出value是1的key
- 位运算
- 假设数组中最大的数字二进制是32位的
- 每一次都对数组中的所有数字从右到左去计算1的个数,然后对3取余计算最终结果
3、代码
class Solution:
def singleNumber(self, nums: List[int]) -> int:
# dic = collections.defaultdict(int)
# if not nums:
# return 0
# for item in nums:
# dic[item]+=1
# for k,v in dic.items():
# if v==1:
# return k
res = 0
bit=1
for i in range(32):
count = 0
bit = 1<<i
for i in nums:
if i&bit!=0:
count+=1
if count%3!=0:
res |= bit
return res-2*32 if res >2**31 -1 else res
总结:位运算十分巧妙,在计算出现次数这种题目中尤为有用。