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

