ハッシュに初期値を設定する方法がわからなかったため、備忘録としてまとめます。
目次
問題
LeetCodeで、「入力値の配列の値に重複があればtrueを、なければfalseを返すメソッド」の実装に取り組んでいました。
InputとOutputの例は次のとおりです。
Input | Output |
[1, 2, 3, 1] | true |
[1, 2, 3, 4] | false |
ぼくは次のように実装していました。
# @param {Integer[]} nums
# @return {Boolean}
def contains_duplicate(nums)
counter = {}
nums.each do |num|
counter[num] += 1
return true if counter[num] > 1
end
false
end
しかしこれだと、次のエラーが出てしまいます、、。
Line 7: undefined method `+' for nil:NilClass (NoMethodError) in solution.rb (block in contains_duplicate)
counter[num] += 1
^
Line 6 in solution.rb (each)
Line 6 in solution.rb (contains_duplicate)
Line 18 in solution.rb (__driver_helper__)
Line 31 in solution.rb (block in _driver)
Line 28 in solution.rb (each)
Line 28 in solution.rb (each_slice)
Line 28 in solution.rb (_driver)
Line 43 in solution.rb (<main>)
counter[num]
がnil
になってしまうためエラーが出ていると思ったんですが、どうすればcounter
のハッシュに初期値を設定できるかがわかりませんでした、、。
解決策
結論として、次のように修正することで、初期値の設定ができます。
# @param {Integer[]} nums
# @return {Boolean}
def contains_duplicate(nums)
# counter = {} を修正
counter = Hash.new(0)
nums.each do |num|
counter[num] += 1
return true if counter[num] > 1
end
false
end
Hash.new
を使うことで、ハッシュにデフォルト値を設定することが可能です。
これでLeetCodeの問題に対する解答をエラーなく実行できるようになりました!
おわりに
重複の有無を判定するタイプの問題はLeetCodeなどではよく出てくるので、Hash.new
は使う機会が増えそうです。
コメント