Проверка наличия хеш-ключа в Ruby для каждого итератора - PullRequest
1 голос
/ 09 марта 2019

Играя с алгоритмом 2 сумм в Ruby.

Я инициировал хэш t, а затем внутри каждого итератора я пытаюсь проверить, существует ли ключ в t.По какой-то причине утверждение if никогда не оценивает t [target-n] как true, хотя я добавляю его в else-часть.

def two_sum(nums, target)
    t={}
    a=[]
    nums.each do |n|
        if t[target-n]
            a << nums.index(n)
            a << nums.index(t[target-n])
            return a
        else
            t[target-n] = n
        end
    end
end

1 Ответ

3 голосов
/ 09 марта 2019

Если вы напечатаете эту строку отладки 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...