56-I 数组中找出出现次数为1的数,这种属于位运算
题目描述:
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例1:
输入:nums=[4,1,4,6]
输出:[1,6]或[6,1]
class Solution(object):
def singleNumbers(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
ret = 0
a = 0
b = 0
# 所有数字异或
for n in nums:
ret ^= n
# 找出异或结果里面第一个非0的,则两个出现1的数,在这里一定是不同的,根据0或1,对其他数分组异或,最后得到的结果就是出现1次的数
h = 1
while(ret & h == 0):
h <<= 1
for n in nums:
if (h & n == 0):
a ^= n
else:
b ^= n
return [a, b]
56-II
题目描述
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
实例:
输入:nums = [9,1,7,9,7,9,7]
输出:nums = 1
位运算,list的数的每一位和1做&运算,统计次数结果和3相除。得到出现次数为1的数在该位的数值。
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
res = 0
for i in range(31):
cnt = 0
bit = 1 << i
for num in nums:
if num & bit != 0:
cnt += 1
if cnt % 3 != 0:
res |= bit
return res