LeetCode「Set Mismatch」问题中Cyclic Sort实现出现无限循环的问题排查求助
LeetCode「Set Mismatch」问题中Cyclic Sort实现出现无限循环的问题排查求助
我正在尝试用Cyclic Sort(循环排序)解决Set Mismatch问题,先给大家说明下这个题的核心要求:
你有一个原本包含从
1到n所有整数的集合s,但其中一个数字重复了,同时另一个数字缺失了。给定代表当前集合状态的整数数组nums,找出重复的数字和缺失的数字,以[重复数, 缺失数]的形式返回。
示例
- 输入:
nums = [1,2,2,4]
输出:[2,3] - 输入:
nums = [1,1]
输出:[1,2]
我的当前实现
我本来想通过循环排序把每个数字放到它对应的正确位置,以此定位出错位的重复数。但现在代码在处理某些输入(比如[2,3,2])时会陷入无限循环,下面是我的代码实现:
from typing import List def findErrorNums(nums: List[int]) -> List[int]: i = 0 n = len(nums) duplicated = 0 while i < n: print(f"i: {i}") print(f"Before: {i}, nums: {nums}") # 如果数字已经在正确的位置,跳过 if i == nums[i] - 1: i += 1 # 如果目标位置已经有相同的数字,说明这是重复数 elif nums[i] == nums[nums[i] - 1]: duplicated = nums[i] i += 1 # 把数字交换到它的正确位置 else: nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i] print(f"After: {i}, nums: {nums}") print() # 找出缺失的数字 for i in range(n): if i + 1 != nums[i]: return [duplicated, i + 1]
遇到的问题
当输入为nums = [2,3,2]时,代码直接进入无限循环。我打印了调试信息,发现nums[0]一直在2和3之间来回交换,完全没有进展:
调试输出的重复片段如下:
i: 0 Before: 0, nums: [3, 2, 2] After: 0, nums: [2, 3, 2] i: 0 Before: 0, nums: [2, 3, 2] After: 0, nums: [3, 3, 2] i: 0 Before: 0, nums: [3, 3, 2] After: 0, nums: [2, 3, 2] i: 0 Before: 0, nums: [2, 3, 2] After: 0, nums: [3, 3, 2] ... (上述过程无限重复)
我实在搞不懂为什么会出现这种情况——为什么3会被重复处理而无法正确交换到对应的位置?我的代码里到底哪里藏着bug呀?
备注:内容来源于stack exchange,提问作者Suhas
相关产品推荐
相关产品推荐

