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

LeetCode C# TwoSum重复元素用例返回错误索引的问题求助

LeetCode C# TwoSum重复元素用例返回错误索引的问题求助

嘿,我仔细看了你的代码和遇到的问题,确实在处理{3,3}这种重复元素的测试用例时会踩坑,咱们来一步步拆解问题出在哪,以及怎么修复它。

首先先明确你的需求:给定数组和目标值,返回两个数的索引,它们的和等于目标值。你的代码在元素不重复的情况下能正常工作,但碰到重复元素就翻车了,对吧?

咱们先揪出核心问题:你用来判断“两个元素不是同一个位置”的条件写错了!

看这段代码:

if (Array.IndexOf(nums, currentNum) != Array.IndexOf(nums, numsTemp[innerIndex]))

当数组里有两个3的时候,Array.IndexOf(nums, 3)不管调用多少次,返回的都是第一个3的索引0,所以当index=0(对应第一个3)、innerIndex=1(对应第二个3)时,这个条件会变成0 != 0,结果是false,直接跳过了后面判断和为目标值的逻辑——这就导致你根本没触发处理重复元素的代码,自然返回错误的结果。

那怎么修复呢?其实很简单,你不需要用Array.IndexOf来判断索引是否重复,直接用循环里的index和innerIndex这两个真实的索引变量就行!把上面的条件改成:

if (index != innerIndex)

这样当两个元素是数组里不同位置的元素时,条件就会成立,哪怕它们的值相同。

另外,你的代码还有可以优化的地方:

  • 不需要拷贝原数组numsTemp,直接遍历原数组就行,拷贝完全是多余的操作;
  • 找到符合条件的索引后,你只用了break跳出内层循环,但外层循环还会继续跑,其实可以直接返回结果,节省不必要的循环;
  • 双层循环可以改成内层从index+1开始遍历,这样能避免重复检查同一对元素(比如先检查索引0和1,再检查1和0),效率更高。

如果要重构一下代码,更简洁可靠的写法可以是这样:

public int[] TwoSum(int[] nums, int target) {
    // 外层循环遍历每个元素的索引
    for (int i = 0; i < nums.Length; i++) {
        // 内层从i+1开始,避免重复检查
        for (int j = i + 1; j < nums.Length; j++) {
            if (nums[i] + nums[j] == target) {
                // 找到结果直接返回,不用继续循环
                return new int[] { i, j };
            }
        }
    }
    // 题目保证有解,这里随便返回或者抛出异常都可以
    return new int[2];
}

这个版本处理{3,3}的情况时,i=0、j=1会直接触发条件,返回[0,1],完全符合要求。

如果坚持要修复你原来的代码,除了修改那个判断条件,还要注意当找到结果后直接返回,避免后续循环覆盖正确值。

备注:内容来源于stack exchange,提问作者Araujo Red

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 08:48:12