题目描述:

题解一:dict
1.利用list result保存最终只出现一次的两个数字,numsdict记录nums每个数字num出现的次数。
2.遍历nums,如果当前num不在numsdict中,说明num是只出现一次的数字,或者是出现两次数字的第一次,将num加入result,然后numsdict[num]设置为1。如果num在numsdict中,说明num已经在数组中出现第二次,如果之前num加入了result,则将num从result去掉。
class Solution:
def singleNumbers(self, nums: List[int]) -> List[int]:
numsdict = {}
result = []
for num in nums:
if num in numsdict:
if num in result:
result.remove(num)
else:
numsdict[num]=1
result.append(num)
return result

题解二:位运算
1.a^a=0 a^0=a,即一个数和自身做异或结果为0,一个数和0做异或操作结果为自身。
2.数组nums中所有数字做异或,出现两次的数字结果亦或结果均为0,因此nums中所有数字的异或结果ret为其中只出现一次的两个数字的异或结果。
3.找到ret中为1的位置idx,将nums中数字按照idx为0和为1,分为两组。
4.因为两个只出现一次的数字不同,所以这两个数字的第idx位不同。因此第一组数字为:一个出现一次的数字+若干对出现两次的数字,第二组:另一个只出现一次的数字+若干对出现两次的数字。
5.对第一组所有数字做异或结果为第一个只出现一次的数字,第二组所有数字做异或,结果为第二个只出现一次的数字。
class Solution(object):
def singleNumbers(self, nums):
ret = 0
idx = 0
for n in nums:
ret^=n
while ret&1==0:
idx = idx+1
ret = ret>>1
r1 = 0
r2 = 0
for n in nums:
if (n>>idx)&1==0:
r1^=n
else:
r2^=n
return [r1,r2]

最后
以上就是超级柠檬最近收集整理的关于剑指 Offer 56 - I. 数组中数字出现的次数python的全部内容,更多相关剑指内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复