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

