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
相关产品推荐
相关产品推荐

