其他分享
首页 > 其他分享> > LeetCode简单题之错误的集合

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