Python中无法找出重复数字及对应缺失元素的问题排查
问题分析与解决
原代码存在的问题
- 返回值未接收:主函数调用
Solution().findErrorNums(arr)后,没把返回值赋值给变量,导致print(arr)输出的还是原数组。 - 逻辑错误:遇到重复元素就直接用
nums[i]+1当缺失值完全不成立,缺失值和重复值没有必然的+1关系,比如输入[2,2,3,4]时,缺失值是1,这个逻辑就彻底失效。 - 返回格式错误:题目要求返回数组,原代码返回集合,不符合要求。
修正方案
推荐两种靠谱的实现思路:
思路1:总和计算法
利用1到n的理论总和、数组实际总和、去重后总和的差值,直接算出重复值和缺失值:
- 1到n的理论总和:
total = n*(n+1)//2 - 重复值 = 数组实际总和 - 去重后总和
- 缺失值 = 理论总和 - 去重后总和
思路2:哈希表统计法
统计每个数字的出现次数,遍历1到n找出出现2次的重复值、出现0次的缺失值。
修正后的代码
总和计算法实现
class Solution(object): def findErrorNums(self, nums): n = len(nums) # 计算1到n的理论总和 total = n * (n + 1) // 2 # 数组去重后的总和 unique_sum = sum(set(nums)) # 数组实际总和 actual_sum = sum(nums) # 计算重复和缺失的数字 duplicate = actual_sum - unique_sum missing = total - unique_sum return [duplicate, missing] if __name__ == '__main__': arr = [1,2,2,4] # 接收函数返回结果 result = Solution().findErrorNums(arr) print(result) # 输出 [2,3]
哈希表统计实现
class Solution(object): def findErrorNums(self, nums): count = {} n = len(nums) duplicate = -1 # 统计每个数字的出现次数 for num in nums: count[num] = count.get(num, 0) + 1 if count[num] == 2: duplicate = num # 查找缺失的数字 missing = -1 for i in range(1, n+1): if i not in count: missing = i break return [duplicate, missing] if __name__ == '__main__': arr = [1,2,2,4] result = Solution().findErrorNums(arr) print(result) # 输出 [2,3]
内容的提问来源于stack exchange,提问作者PurpleRabbit
相关产品推荐
相关产品推荐

