見出し画像

LeetCodeを50問解いてみて変わったこと

LeetCodeを今年中に100問解くという目標をたててから、約3ヶ月。現在50問解くことに成功したので、一回振り返りをしてみようと思います。

LeetCodeとは

コーディング面接で使われる問題の学習サイト。GAFA等の外資系企業の面接対策として有効(らしい)。好きな言語を選んで問題を解くと、自分が書いたコードが他の人のコードに比べてどれくらい適切な書き方をしているのかがわかるようになっています。

何故解いたのか?

メンターに勧められたからというのが一番大きいのですが、CSを専攻していない自分に足りないプログラミングの考え方みたいなものが学べるのではないかと思いました。

役に立った?

たちました!外資系の転職対策に有効と書いたのですが、日本の会社でも同じような問題を出してくるところがあり、転職活動の時に助けられました。正直LeetCodeを解いていなかったら全く歯が立たなかっただろうなぁと思います。

LeetCodeを解いてみて変わったこと

コーディングテストに対して身構えなくなった
ある程度数をこなしたせいか、基本的な問題であれば全く歯が立たないということがなくなり、不安になりすぎずに問題を解けるようになりました。ただ、実際のGAFAの面接のように人に解説しながら問題を解くということはあまりやったことがないので、面接形式で問題を解くことになったらまだ不安に感じる気がします。

基本的なアルゴリズムについて知ることができた
基本情報技術者試験にでてくるような基本的なアルゴリズムの使い方を知ることができました。ただ本を読んでいただけでは頭に入らなかったと思うのですが、実際に問題を解いてから適切なアルゴリズムを知ることで、その必要性を実感しながら学ぶことができました。

for文の入れ子構造にモゾモゾするようになった
LeetCodeを解くと実行速度とメモリ使用量を出してくれてて、その数字の良さで自分が他のエンジニアと比べてどれくらいの位置にいるのかがわかります。多くの問題がfor文を多用すれば正解をだせるようになっていますが、効率がよくないため順位がさがっていく&あまりにfor文を多用するとそもそも不正解にされたりします。そのため業務でもfor文が2つ以上あると、どうにか工夫してfor文を減らせないか…と考えるようになりました。この3ヶ月で実際にfor文を減らせた経験はないのですが、いつか学んだアルゴリズムを使ってfor文を減らせたら感動すると思います。

LeetCodeで学んだアルゴリズム

線形探索 (linear search)
要素を1つずつ全て探索するアルゴリズム。何も考えずに問題を解こうとすると大抵この方法になります。答えを返せても、メモリも速さも最低レベルになることが多いので、どうにかこの方法をしないで問題を解くかを考える必要があります。

二分探索 (binary search)
要素がソートされている時に、要素の中央の値と求めたい値の大小関係を確認して対象のサイズを半分(1/2)にしながら探していく方法。時間計算量O(log n)で答えにたどり着くことができます。大事なことは、ソートされているデータにしか使えないということ。私の場合「ソートされた」という言葉がでてきたら、まずこの方法が使えないか考えます。

深さ優先探索 (depth-first search, DFS)
初めのノードから目的のノードか子供のないノードにたどり着くまで深く伸びていく探索方法。それ以上進めなくなった場合、戻ってきて更に他の枝の一番深いノードまで対象ノードを探しにいきます。ツリー問題だけではなくて迷路や塗り潰しの問題にも使います。

幅優先探索 (breadth-first search, BFS)
初めのノードから目的のノードがないか、隣接した全てのノードをチェックしながら探索していく方法。自然と最短距離を求められるので最短経路を考答えよと会ったらBFSの解き方が便利だそう(正直、存在は学んだのですが…BFSの解き方をあまり使っておらず、理解しきれているか若干不安なところです💦復習しなくては…)。

動的計画法(dynamic programming)
(工事中)
フィボナッチ数列や階段を登るパターンを求める問題で使用しました。

LeetCodeで学んだデータ構造

配列
数値のみがキーになるデータ構造。

辞書 (Dictionary)、連想配列
キーに数値以外を設定できる配列のこと。辞書と言われて何かと思ったら連想配列のことでした。ハッシュ、マップとも言います。O(n)で問題を解くために答えの候補を辞書に登録する方法を何度も使いました。

木構造 (Tree)
ノード(頂点、接点)とノード間を結ぶエッジ(枝)で表現されるデータ構造。私はまだ二分木しか出会っていません。深さ優先探索や幅優先探索で答えを探していきます。

連結リスト (Linked list)
データ同士に繋がりのあるリスト。次の要素へのリンクと値の情報が入っています。要素の操作→次のデータに移動→要素の操作→次のデータに移動で操作するパターンが多かった気がします。

スタック (Stack)
先入れ後出し(取り出す際、後に入れたものから出す)の構造で保持するデータ構造。操作としてpush(スタックにデータを入れる)とpop(スタックからデータを取り出す)を使います。

まとめ

50問解いたのですが、本当に1回ずつただ解いて解答を理解しただけなので、今年の目標残り50問と、今回解いた50問の解き直しをして知識を定着させていきたいと思います。ここまで読んでいただきありがとうございました!

この記事が気に入ったらサポートをしてみませんか?