Если вы напечатаете эту строку отладки p "#{target-n}, #{t}"
в начале цикла, вы сможете узнать, почему.
...
nums.each do |n|
p "#{target-n}, #{t}"
...
Используя этот вызов two_sum([3, 5, 2, -4, 8, 11], 7)
вы получите:
# "4, {}"
# "2, {4=>3}"
# "5, {4=>3, 2=>5}"
# "11, {4=>3, 2=>5, 5=>2}"
# "-1, {4=>3, 2=>5, 5=>2, 11=>-4}"
# "-4, {4=>3, 2=>5, 5=>2, 11=>-4, -1=>8}"
Как видите, ключ, который вы ищете, добавляется частью кода else
.
Один из возможных вариантов (грубая сила) - создать хэш пар, пропуская дублированные пары. Затем выполните итерации по хешу, заполняющему массив a, если каждая из пар в nums
.
В конце вызова a
должен быть возвращен методом.
def two_sum(nums, target)
t={}
a=[]
nums.each do |n|
t[target-n] = n unless t[n]
end
t.each { |k,v| a << [k,v] if nums.include? k }
a
end