标签:
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
260. Single Number III [medium] (Python)
标签:
原文地址:http://blog.csdn.net/coder_orz/article/details/52071599