您的位置:首页 > 编程语言 > Python开发

260. Single Number III [medium] (Python)

2016-07-30 10:58 323 查看

题目链接

https://leetcode.com/problems/single-number-iii/

题目原文

Given an array of numbers
nums
, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

For example:

Given nums =
[1, 2, 1, 3, 2, 5]
, return
[3, 5]
.

Note:

The order of the result is not important. So in the above example,
[5, 3]
is also correct.

Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?

思路方法

题目要求O(1)的空间复杂度和O(n)的时间复杂度,限制了不能使用dict之类的辅助结构,故不再讨论此类解法。

题目要求找到两个只出现一次的数,如果之前做过:136. Single Number 这个题的话,应该能想到用异或操作。

然而一遍异或无法得到两个值, 想到最终异或得到的值肯定不为0,那么一定至少有一个位是1。根据这一位是否为1可以将原数组分成两拨,分别将两拨数的总异或求出来,得到的结果就是要求的两个数。

另外,找一个数的二进制表示中1的位置有很多方法,下面两个代码提供了两个不同的方法。

思路一

按照上面写的思路写代码即可。

代码

class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res = [0, 0]
tmp = reduce(operator.xor, nums)
mask = tmp & (-tmp)
for i in nums:
if i & mask:
res[0] ^= i
else:
res[1] ^= i
return res


思路二

只求一拨数的异或,再用总的异或值与该值异或可以得到另一个所求数,减少不少计算量。

代码

class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res1 = 0
tmp = reduce(operator.xor, nums)
mask = tmp - (tmp & (tmp - 1))
for i in nums:
if i & mask:
res1 ^= i
return [res1, tmp ^ res1]


PS: 写错了或者写的不清楚请帮忙指出,谢谢!

转载请注明:http://blog.csdn.net/coder_orz/article/details/52071599
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python LeetCode