Torihaji's Growth Diary

Little by little, no hurry.

LeetCode生活1日目

はじめに

これは プログラミングには数学必要ないと思っていた人間が

最近になって実務で扱った幅優先探索が全くわからんことに焦りを感じ

まずは簡単なアルゴリズムからやってみようという考えのもと

突然始まったものになります

  • 毎日必ず1問は解くこと。

  • 時間がある時に復習すること(このルールに対してはゆくゆく詰めていきたい)

進め方

neetcodeという leetcodeの問題ベスト100選!みたいなものをまとめたサイトがあるので

そのサイトを元に難易度が簡単なものからやっていく。

(neetcodeというのは 昔 neetだったサイト主がgoogleに入るためにleetcodeの問題を勉強し、

途中で得た知見をまとめた優良サイトのこと)

今回はrubyで進めていきたいが、neetcodeにはrubyがないので

neetcodeでやる問題をleetcodeで見つけて、それをやるというやり方にしていこうと思う。

考え方は自分が考えたやり方。わからないときはどうわからないかを記載して答えを見る。

挫折を防ぐために5分考えてもわからなかったら答えを見ようと思う。

Contains Duplicate

数字の配列numsが与えられている。重複要素があればtrue、なければfalseを返す。

考え方1

配列の要素を頭からloopを回して参照する。要素Aを取り出した後、その要素 + 1 ~ 末尾までに

要素Aが存在するかどうかで判定する

def contains_duplicate(nums)
  nums.each_with_index do |num, i|
    return true if nums.slice((i+1)..-1).include?(num)
  end
end

sliceは配列の要素を切り出して新しい配列を返してくれる。

include?は引数に与えた値が配列に存在するかを指定する。

考え方2

Setを使うやり方。Setは要素の順序は保証しないが、要素の重複は許さないもの。

これに対して値を追加し、判定に使用する

def contains_duplicate(nums)
    hashset = Set.new
    nums.each do |num|
        return true if hashset.include?(num)
        hashset.add(num)
    end
    false
end

考え方3

答え出して他の人のをみていたら見つけた。なるほどと思った

配列の要素数を調べ、その配列に対して重複を削除するuniqを適用した後の配列の要素数と比べることで

判断するというもの。

def contains_duplicate(nums)
  nums.count != nums.uniq.count
end

終わりに

まだやりたいという気持ちがあるが、1問やったので合格。

easyくらいなら続けられそうなので頑張りたい。