概述
136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
如果不限制空间复杂度和时间复杂度这道题挺好做,可以用无脑遍历,可以用哈希表,但是如果进行了限制,那就不好做了,下面这个通过异或的做法很新颖,特此记录。
通过上面的结论,因为题目中说明:只有一个是出现一次,其他都出现了2次,那么我们对数组依次进行异或得到的就是最后的只出现一次的值
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return(reduce(lambda x, y: x^y, nums))#reduce是python的内置函数,
#reduce接受一个函数和一个序列化数据作为参数,相当于把序列化的值交给函数处理,
#一般reduce会和lambda函数一起使用
260. 只出现一次的数字 III
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
题解:为了使空间复杂度仍然为O(1),这里用到了异或操作和逻辑与操作,异或操作上面已经说过,逻辑与操作基本内容是:对于2个二进制数,只有相同位置上的值全为1则逻辑与后相应的位上仍然是1,例如0010&1110之后得到是0010.代码解释就看下面的注释代码。基本思想:
- 先将数组中的所有数字进行异或操作,得到xor,由于只有2个是单一的数字,其他的数字都是成对出现,所以最后的异或操作得到的结果实际上就相当于只出现一次的2个数的异或;
- 初始化ten为1,因为1的二进制的首位是1,其他位置上都是0,这样我们在进行移位的时候除了位置为1的位置与xor进行逻辑与操作后才有可能是1;
- 进行循环,知道xor与tem的逻辑与操作不为1,得到tem,目的是找到xor中那个位置上的值为1,如果xor位置上为1,证明原数组中的两个数量为1的数字的异或操作之后该位置为1;
- 找到这个位置为1的tem之后,遍历nums,将所有元素与tem进行逻辑与操作,进行分类,输出
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
xor = 0
num1 = 0
num2 = 0
for num in nums:
xor = xor ^ num
tem = 1
while not tem & xor:
tem <<= 1#移位操作,0001移位之后变为0010,0010移位变为0100
for num in nums:
if tem & num:
num1 ^= num
else:
num2 ^= num
return([num1, num2])
最后
以上就是繁荣紫菜为你收集整理的leetcode--python--只出现一次的数字的全部内容,希望文章能够帮你解决leetcode--python--只出现一次的数字所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复