【问题标题】:Checking if hash key exists within a Ruby each iterator检查 Ruby 每个迭代器中是否存在哈希键
【发布时间】:2019-03-09 11:29:54
【问题描述】:

在 Ruby 中使用 2 和算法。

我已经启动了一个哈希 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

【问题讨论】:

  • 如果你想检查一个哈希是否有一个键,并根据键的存在而不是这个键的值来做一些事情,请使用.has_key?(key).key?(key)方法。这是您应该检查的第一件事。
  • 出于某种原因,即使我同时使用.has_key?(key).key?(key) 例如:t.has_key?(target-n) 它仍然不起作用
  • 该方法的实际期望输入/输出是什么?
  • 算法不完整我只是不确定为什么哈希检查 t[target-n] 在添加到 else 语句后不会评估为 true

标签: ruby


【解决方案1】:

如果您在循环的开头打印此调试行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 部分添加的。

一种可能的选择(蛮力)是建立对的哈希,跳过重复的对。如果 nums 中的每一对都包含在数组 a 中,则遍历散列。

最后调用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

【讨论】:

  • 取参数two_sum([2,7,11,15] 9) 似乎在第二次迭代中应该看到t[target-2] 存在并评估为true
  • @Falko,第二次迭代是t[target-7],所以没有。
  • 伟大的@igian 调试时,我的排序已经结束。如果我添加重复项 t[target-1] 将评估为 true。
猜你喜欢
  • 2012-04-05
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
相关资源
最近更新 更多