【Ruby】ハッシュに初期値を追加する【LeetCodeで必須】

ハッシュに初期値を設定する方法がわからなかったため、備忘録としてまとめます。

バージョン
  • Ruby 3.2.2
記事の信頼性
  • ぼくは独学で未経験から従業員300名以上の自社開発企業へ転職しました。
  • 実務ではVue.jsとRailsを毎日書いています。
  • 初心者や駆け出しエンジニアがつまづくポイントも身をもってよく理解しています。
目次

問題

LeetCodeで、「入力値の配列の値に重複があればtrueを、なければfalseを返すメソッド」の実装に取り組んでいました。

InputとOutputの例は次のとおりです。

InputOutput
[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は使う機会が増えそうです。

参考文献
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

未経験でSESから従業員300名以上の自社開発企業に転職しました。業務や個人開発で直面した問題や、転職・学習の経験を発信していきます。

コメント

コメントする

目次