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

C#自定义重复值检查函数异常:无法适配{2,1,1}测试用例

问题分析与修复

核心问题点

  1. 循环边界错误:内层循环的j < array.Length - 1限制了j的最大值为array.Length-2,导致数组最后一个元素永远不会被纳入重复检查,这就是{2,1,1}测试用例失效的直接原因。
  2. 索引记录逻辑偏差:当前代码仅记录每个重复元素第一次出现的配对索引,没有跟踪该元素最后一次出现的索引,无法满足“返回右侧索引最大的重复元素”的需求。
  3. 无重复场景返回值错误:当数组无重复元素时,代码错误返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:50:34