剑指 Offer 56 - I
数组中数字出现的次数:一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
参考
class Solution:
def singleNumbers(self, nums: List[int]) -> List[int]:
tem = 0
mid = 1
a, b = 0, 0
for num in nums:
tem^=num
while mid & tem == 0:
mid <<= 1
for n in nums:
if n & mid == 0:
a ^= n
else:
b ^= n
return([a, b])
剑指 Offer 56 - II
数组中数字出现的次数 II:在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字
参考
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
tem = [0]*32
for i in nums:
for j in range(32):
tem[j] += i & 1
i >>= 1
res = 0
for i in range(32):#注意这里是先左移,再进行异或,因为再最后一次异或之后不能再左移了;如果想改为先异或再左移,则应该少循环一次
res <<= 1
res |= tem[31-i] % 3
return(res if tem[31] % 3 == 0 else ~(res & 0xffffffff))