LeetCode简单题之错误的集合
作者:互联网
题目
集合 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)+1
for 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=0
j=1
if nums[0]!=1:
temp2=1
if nums[-1]!=len(nums):
temp2=len(nums)
while j<len(nums):
if nums[j]-nums[i]==2:
temp2=nums[i]+1
if nums[j]==nums[i]:
temp1=nums[i]
i+=1
j+=1
return [temp1,temp2]
标签:数字,错误,nums,int,List,temp2,集合,LeetCode 来源: https://blog.csdn.net/qq_18560985/article/details/122717453