题目
集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1,2,2,4]
输出:[2,3]
示例 2:
输入:nums = [1,1]
输出:[1,2]
提示:
2 <= nums.length <= 10^4
1 <= nums[i] <= 10^4
来源:力扣(LeetCode)
解题思路
分析题目:如果有重复的数字那么它的频率一定为2,如果有缺失的数字那么它的频率一定为0。我们可以从统计频率的角度来解决此问题。建立字典统计列表种各个数字的频率,然后在1~n中逐个以序列数为关键字访问字典,如果频率为2那么它就是重复的数字,如果访问不到那么它就是缺失的数字。
class Solution:def findErrorNums(self, nums: List[int]) -> List[int]:d={}for i in nums:d[i]=d.get(i,0)+1for i in range(1,len(nums)+1):try:if d[i]==2:temp1=i #记录重复的数字except:temp2=i #记录缺失的数字return [temp1,temp2]
另外,这个题也可以通过排序来完成。设置两个指针访问相邻的两个元素差值是否等于2,如果等于2那么它们之间的那个数便是缺失的数字,如果两个元素相等那么这便是重复的数字,当然这种双指针的解决办法往往需要特殊的处理两个端点。
class Solution:def findErrorNums(self, nums: List[int]) -> List[int]:nums.sort()i=0j=1if nums[0]!=1:temp2=1if nums[-1]!=len(nums):temp2=len(nums)while j<len(nums):if nums[j]-nums[i]==2:temp2=nums[i]+1if nums[j]==nums[i]:temp1=nums[i]i+=1j+=1return [temp1,temp2]