C#自定义重复值检查函数异常:无法适配{2,1,1}测试用例
问题分析与修复
核心问题点
- 循环边界错误:内层循环的
j < array.Length - 1限制了j的最大值为array.Length-2,导致数组最后一个元素永远不会被纳入重复检查,这就是{2,1,1}测试用例失效的直接原因。 - 索引记录逻辑偏差:当前代码仅记录每个重复元素第一次出现的配对索引,没有跟踪该元素最后一次出现的索引,无法满足“返回右侧索引最大的重复元素”的需求。
- 无重复场景返回值错误:当数组无重复元素时,代码错误返回
array[0],但按照初始逻辑应该返回-1。
修复后的代码
public int FirstDuplicateValue(int[] array) { if (array == null || array.Length <= 1) return -1; // 用字典存储元素的首次出现索引和最后出现索引 Dictionary<int, (int firstIdx, int lastIdx)> elementIndices = new(); for (int i = 0; i < array.Length; i++) { int num = array[i]; if (elementIndices.ContainsKey(num)) { // 更新该元素的最后出现索引 elementIndices[num] = (elementIndices[num].firstIdx, i); } else { // 首次出现,记录初始索引 elementIndices.Add(num, (i, i)); } } // 筛选出所有重复元素(首次和最后索引不同) var duplicateElements = elementIndices.Where(kv => kv.Value.firstIdx != kv.Value.lastIdx); if (!duplicateElements.Any()) { return -1; } // 找到最后出现索引最大的元素 return duplicateElements.OrderByDescending(kv => kv.Value.lastIdx).First().Key; } static void Main(string[] args) { int[] test1 = { 2, 1, 5, 3, 3, 2, 4 }; Console.WriteLine(new Program().FirstDuplicateValue(test1)); // 输出2 int[] test2 = { 2, 1, 1 }; Console.WriteLine(new Program().FirstDuplicateValue(test2)); // 输出1 }
修复说明
- 循环边界修正:移除了内层循环的错误限制,确保每个元素都被检查到。
- 改用字典优化逻辑:用字典高效记录每个元素的首次和最后出现索引,避免嵌套循环带来的O(n²)时间复杂度,提升性能。
- 正确筛选目标元素:先筛选出所有重复元素,再通过最后出现索引降序排序,直接取第一个元素即为需求结果。
- 修正无重复场景返回值:无重复元素时返回
-1,符合初始逻辑的预期。
内容的提问来源于stack exchange,提问作者raicha
相关产品推荐
相关产品推荐

