260. Single Number III [medium] (Python)
2016-07-30 10:58
323 查看
题目链接
https://leetcode.com/problems/single-number-iii/题目原文
Given an array of numbersnums, 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动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法