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

Ruby两数之和算法问题:each迭代器中哈希键存在性判断异常

解决Ruby两数之和算法中的哈希表判断问题

让我来帮你排查下这段代码的问题所在,主要有两个核心问题导致你的if判断始终无法触发:

1. 哈希表的存储逻辑完全搞反了

你当前的代码把target - n作为哈希表的键,值存的是当前元素n,但我们的核心需求是记录已经遍历过的数值及其对应的索引——这样当遇到当前元素的补数(也就是target - n)时,才能快速找到之前遍历过的补数的位置。

举个实际例子:假设输入是nums = [2,7,11,15],target = 9。第一个元素是2,你会把9-2=7作为键,值存2,哈希表变成{7 => 2}。第二个元素是7,你判断t[9-7=2],但哈希表里根本没有键为2的条目,自然触发不了if分支。

2. 使用nums.index(n)获取索引存在隐藏bug

nums.index(n)会返回数组中第一个等于n的元素的索引,如果数组里有重复元素(比如nums = [3,3],target=6),这个方法会返回两个0,导致结果完全错误。


修正后的代码

def two_sum(nums, target)
  num_indices = {} # 键:已遍历的数值,值:对应的索引
  nums.each_with_index do |n, idx|
    complement = target - n
    # 检查补数是否已经在哈希表中(即之前遍历过)
    if num_indices.key?(complement)
      return [num_indices[complement], idx]
    else
      # 把当前数值和索引存入哈希表,供后续元素检查
      num_indices[n] = idx
    end
  end
end

关键修正点说明

  • 改用each_with_index迭代器,直接获取当前元素的索引,彻底避免index方法的重复元素问题
  • 哈希表存储逻辑调整为数值为键,索引为值,每次先检查当前元素的补数是否已被遍历过
  • 用key?方法明确判断键是否存在,比直接取哈希表值更严谨(避免值为nil时的误判)

这个版本的代码不仅能正确触发if分支,还能处理数组包含重复元素的场景,时间复杂度也是O(n),符合两数之和算法的最优要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:10:16