You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:15:17