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

JavaScript转C#:两数之和问题的等价实现方案咨询

C#实现两数之和的方案对比与最优解

思路对应

你在JavaScript里用对象存储元素与索引的映射,这种思路在C#里最直接的对应就是用Dictionary<int, int>——它专门用来实现键值对的快速映射查找,和JS对象的核心作用完全一致。

各类型可行性分析

  • Object:C#的Object是所有类型的基类,但用它来存键值对完全不适用,需要频繁做类型转换,既麻烦又容易出错,性能还差,直接排除。
  • 数组:数组是固定长度的连续存储结构,要实现元素到索引的映射,只能自己遍历查找,整体时间复杂度会达到O(n²),效率极低。
  • List:List本质是动态数组,查找元素仍需线性遍历,同样是O(n)的查找耗时,整体复杂度O(n²),远不如哈希表高效。
  • Dictionary<int, int>:基于哈希表实现,插入、查找操作的平均时间复杂度都是O(1),完美匹配JS对象的使用逻辑,是最优选择。

完整实现代码

using System;
using System.Collections.Generic;

public class TwoSumSolver {
    public int[] FindTwoSum(int[] nums, int target) {
        Dictionary<int, int> numIndexMap = new Dictionary<int, int>();
        
        for (int i = 0; i < nums.Length; i++) {
            int complement = target - nums[i];
            // 找到互补元素,直接返回索引
            if (numIndexMap.ContainsKey(complement)) {
                return new int[] { numIndexMap[complement], i };
            }
            // 未找到则将当前元素和索引存入字典(避免重复元素覆盖,题目假设唯一解时可简化)
            if (!numIndexMap.ContainsKey(nums[i])) {
                numIndexMap.Add(nums[i], i);
            }
        }
        
        // 题目保证存在解,此处为兜底逻辑
        throw new ArgumentException("不存在满足条件的两数组合");
    }

    public static void Main() {
        int[] nums = { 1, 5, 6, 7, 10 };
        int target = 12;
        TwoSumSolver solver = new TwoSumSolver();
        int[] result = solver.FindTwoSum(nums, target);
        Console.WriteLine($"[{result[0]}, {result[1]}]"); // 输出 [1, 3]
    }
}

为什么Dictionary是最优解?

  • 效率最高:只需遍历一次数组,整体时间复杂度O(n),比数组、List的O(n²)快得多。
  • 逻辑对齐:和JS用对象存映射的思路完全一致,代码易读易维护。
  • 类型安全:C#是强类型语言,Dictionary明确指定键值类型,避免了JS对象的隐式类型转换问题,减少bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:20:29