只出现一次的数字 III(Leetcode 260)

1

题目分析

   前面的两道题目都是找出唯一出现的一个数字,如果有两个数字都出现一次,该如何求解呢?

位运算

对于136题来说,找出唯一出现的一个数字,通过异或可以直接求出。如果有两个数字x和y都出现了一次,那么所有数字异或的结果应该就是x和y的异或结果。因为x和y不相同,所以异或的结果一定不为0,所以一定在某个位上有1出现。我们从低到高找到第一次出现1的位置。于是可以得出一个结论。一定x在该为上位1,y为0或者x为0,y为1。所以就可以将这个数组分成part1和part2,part1中所有的元素在该位上都是1,part2中所有的元素在该位上都是0。因此对于part1能通过异或的方法找出唯一出现的一个数字,part2也能通过异或的方法找出唯一出现的一个数字。
q

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import functools


class Solution(object):
def singleNumbers(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
p = functools.reduce(lambda x, y: x ^ y, nums)
p1 = p2 = 0
b = 1
while not (p & b):
b <<= 1
for i in nums:
if i & b:
p1 ^= i
else:
p2 ^= i
return [p1, p2]

刷题总结

  走过路过不要错过,赶紧尝试尝试,新鲜出炉的位运算,小伙伴们一定要掌握它。

-------------本文结束感谢您的阅读-------------
0%