Ruby数组two_sum方法错误排查:重复索引[1,1]问题
排查Ruby Array#two_sum方法的索引重复问题
让我看看你的two_sum方法问题出在哪~
问题根源分析
你代码里的核心问题出在内层循环的判断逻辑上:
- 你用
each_index遍历comp_idx,然后取self[comp_idx + 1]进行求和判断,但你的排除条件unless comp_idx + 1 == self.length || idx == comp_idx只拦住了idx和comp_idx相等的情况,完全没排除idx和comp_idx + 1相等的情况! - 举个例子:当
idx=1(对应元素0)、comp_idx=0时,comp_idx+1=1,这时候两个索引都是1,也就是同一个元素0+0=0,自然就把无效的[1,1]加入了结果数组。 - 另外,你的循环方式还会导致重复检查同一对索引(比如既检查
[0,4]又检查[4,0]),虽然最后排序后可能看起来没问题,但会额外增加不必要的计算。
修正后的代码
我们可以通过只遍历i < j的索引对来彻底解决这些问题——这样既保证两个索引绝对不同,又不会重复检查同一组元素对:
class Array def two_sum final_arr = [] # 外层遍历每个元素及其索引i each_with_index do |num1, i| # 内层只遍历i之后的索引j,确保i < j (i+1...length).each do |j| num2 = self[j] final_arr << [i, j] if num1 + num2 == 0 end end # 按要求对结果排序 final_arr.sort end end
代码解释
- 避免重复与无效索引:内层循环从
i+1开始,确保j永远大于i,既不会出现i == j的情况,也不会重复检查[j,i]这种反向对。 - 逻辑简洁清晰:直接判断两个不同索引的元素和是否为0,符合
two_sum的核心需求。 - 测试验证:调用
[-1, 0, 2, -2, 1].two_sum会返回预期的[[0, 4], [2, 3]]。
内容的提问来源于stack exchange,提问作者Monique
相关产品推荐
相关产品推荐

