题目:
集合 s
包含从 1
到 n
的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums
代表了集合 S
发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1,2,2,4] 输出:[2,3]
示例 2:
输入:nums = [1,1] 输出:[1,2]
解题思路:
1.循环解法
找缺失数,首先判断首尾是否缺失,列表排序后前一位减后一位=2说明此处缺失一个数字
找重复值,遍历排序后的数组,nums[i]==nums[i]-1即为重复数
class Solution(object):
def findErrorNums(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
repeat =0
lose = 0#定义重复与丢失数
nums.sort()#对列表进行降序排序
if nums[0] != 1:#排序后最小的不为1则丢失数为1
lose = 1
elif nums[-1] != len(nums):#最后一位数与列表长度不同则为丢失数
lose = len(nums)
for i in range(1, len(nums)):#遍历数组
if nums[i] == nums[i - 1]:#寻找重复数
repeat = nums[i]
if nums[i] - nums[i - 1] == 2:#前一位减后一位差值为2时说明此处缺失一个数字
lose = nums[i] - 1
return [repeat, lose]
2.数学解法
此方法借鉴力扣大神,
class Solution:
def findErrorNums(self, nums: List[int]) -> List[int]:
total = sum(range(1,len(nums)+1))#从一到列表长度值累加,可得如果无重复数的列表数据和
num = total - sum(set(nums))#set函数对列表进行去重复操作,此时重复的数据已被去除,set(nums)与nums之间只差一个缺失数
diff = total - sum(nums)#两者做差得出重复数对原数组的影响值
return [num-diff,num]#num-diff=sum(nums)-sum(set(nums))原nums总值减去去重复操作后的nums得重复数