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

如何优化C#有序数组值配对程序?现有实现存在值缺失问题

三指针法实现有序数组的配对填充

针对三个升序int数组的配对需求,三指针法是最优解——时间复杂度O(n)(n为三个数组总元素数),逻辑清晰还能彻底解决元素遗漏(比如之前的7)问题。核心思路是利用数组升序的特性,每次定位当前要处理的最小目标值,逐个检查三个数组是否包含该值:存在则取元素并移动指针,不存在则填null。

代码实现

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        int[] X = { 1, 2, 3, 5, 6, 7 };
        int[] Y = { 1, 2, 4, 5, 6, 7 };
        int[] Z = { 1, 2, 4, 6, 7 };

        var result = new List<Tuple<int?, int?, int?>>();
        int i = 0, j = 0, k = 0;
        int lenX = X.Length, lenY = Y.Length, lenZ = Z.Length;

        // 只要有一个数组未遍历完,就继续处理
        while (i < lenX || j < lenY || k < lenZ)
        {
            // 确定当前要处理的最小目标值(兼容指针越界情况)
            int currentMin = int.MaxValue;
            if (i < lenX) currentMin = Math.Min(currentMin, X[i]);
            if (j < lenY) currentMin = Math.Min(currentMin, Y[j]);
            if (k < lenZ) currentMin = Math.Min(currentMin, Z[k]);

            // 匹配目标值并移动对应指针
            int? xVal = (i < lenX && X[i] == currentMin) ? X[i++] : null;
            int? yVal = (j < lenY && Y[j] == currentMin) ? Y[j++] : null;
            int? zVal = (k < lenZ && Z[k] == currentMin) ? Z[k++] : null;

            result.Add(Tuple.Create(xVal, yVal, zVal));
        }

        // 打印验证结果
        foreach (var tuple in result)
        {
            Console.WriteLine($"({tuple.Item1 ?? "null"}, {tuple.Item2 ?? "null"}, {tuple.Item3 ?? "null"})");
        }
    }
}

关键逻辑说明

  1. 指针定位:三个指针i/j/k分别对应三个数组的遍历位置,初始均为0。
  2. 目标值选取:每次取三个指针当前指向的有效元素(未越界)中的最小值,确保结果始终有序。
  3. 元素匹配与指针移动:对每个数组,若当前元素等于目标值,则取该元素并将指针后移;否则填充null。
  4. 循环终止:当三个指针都遍历完各自数组时停止,此时所有出现过的唯一值都已处理完毕。

运行输出结果

(1, 1, 1)
(2, 2, 2)
(3, null, null)
(null, 4, 4)
(5, 5, null)
(6, 6, 6)
(7, 7, 7)

内容的提问来源于stack exchange,提问作者hi there

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:32:18