効果的にLeetcodeを使いこなす方法

ああ、秋学期はインターンシップや新卒のフルタイムの仕事を求めるシーズンですね。だから、私のように大手テック企業の面接準備をしている方なら、きっとLeetcodeを見たことがあるでしょう。もしまだなら、他のプラットフォームからLeetcodeに切り替えてみてください(そしてそれにこだわってください)。Leetcodeにはたくさんの問題があり、優れたコミュニティが解答を寄せていて、素晴らしいディスカッションセクションがあります。

もしこの道の新米であれば、私のLeetcode サバイバルガイドをチェックしてください。そうすれば、ランダムなLeetcodeの問題を解いて時間を無駄にしたり、データ構造やアルゴリズムを学ぶために高価なコースを買うことにならずに済みます。

この投稿では、面接準備においてLeetcodeのさまざまな機能をどう使うかについて書きます。初めての面接であろうと慣れた人であろうと、これらの機能をすべて知っているわけではないかもしれませんし、使っていないかもしれません。

この投稿には二つのセクションが含まれており、一つはすべてのユーザーを対象に、もう一つのセクションはLeetcode Premium(LC Premium)を購入したユーザー向けです。目次を参考にして、任意のセクションにジャンプできます。

目次

すべてのユーザー向け

解答に関するディスカッションセクションを無視しないください

あなたが解答を提出したら、Leetcodeはあなたの解答の実行時間が過去に提出されたすべての解答とどう比較されるかを表示します。ただ、あなたのコードの実行時間はあなたのコードを実行しているサーバーの負荷状態にかなり依存しているので、常に正確とは限りません。実際のパフォーマンスの見積もりを得るには、何度かコードを実行する必要があるかもしれません。

もしあなたが初回で提出した解答が、すべての解答よりもわずか5%速い場合、せいぜい20%速いと期待しないでください。この時点で、問題のディスカッションタブをチェックすることをおすすめします。あなたは非標準的な解答を書いていたかもしれませんし、コードの一部を調整する必要があるかもしれません。

たとえば、JavaでStringBuilderクラスを使用せずに文字列を変更していたり、再帰関数呼び出しで多くのパラメーターを渡していたり、実際にはキューで十分な場合にヒープを使用していたり、他にも多くの要因があります。ですから、ディスカッションセクションに行ってみて、より簡潔で(そしてより効率的な)解答の書き方を見つけてください。

もしあなたの解答が大部分の解答を上回ったら、他の人を助けるための投稿を書くことをおすすめします。説明をタイプすることも役立ちます。適切な見出しを使って、正しいタグを提供するようにしてください。

面接体験に関するディスカッションセクションを無視しないでください

プレミアムユーザーでも無料ユーザーでも、他のユーザーの面接体験をチェックするべきです。なぜでしょう?主に2つの理由があります:

  1. あなたの面接の形式(OA、電話スクリーニング、現地での面接、HR/チームマッチングラウンド、報酬)を予測するのに役立つからです。
  2. Leetcodeにさえ掲載されていない問題に遭遇するかもしれません。

すべての投稿が詳細な内容になっているわけではありません。結果ページを複数ページ通って、質の高い面接体験を集めて、エクセルシートに保存することをおすすめします。個人的にはNotionを使用しています。

毎日のLeetcode問題を無視しないでください

毎日のLeetcode問題は、さまざまな問題を経験する絶好の方法です。たとえ問題を全て自力で解けなくても、問題を読んでアプローチを考え、出てこなければディスカッションセクションをチェックしてください。

毎日の問題を一つ一つ解こうという衝動に駆られないようにしてください。問題や解答に圧倒されたら、面接準備に集中しましょう。問題が難解で解けなかったとしても何の問題もありません。問題が良くて後で戻りたい場合は、エクセルシートに追加するか、Leetcode上であなたのカスタムリストに追加できます。

入力サイズを無視しないでください

問題を読むとき、入力の制約は常に問題の下部に記載されています。すべての質問についてそれを読む習慣をつけることは良い練習であり、面接官にそれを明確にすることも同様です。

なぜでしょうか?入力の制約は受け入れられる解答の時間複雑度と直接相関しています。私にも解答ができると思ったけど、解答をコード化して試さなかったことが何度かありました。なぜなら、私の解答は時間制限を越えると思ったからです。その後、ディスカッションセクションに行くかビデオを見ると、同じ解答を見るときはいつもイライラします。

以下は入力サイズと時間複雑度をマッピングする表です。

入力サイズ 時間複雑度
>= 10^5 O(n) / O(nlogn)
1000-5000 O(n^2)
100-500 O(n^3)
0-32 O(2^n)
0-15 O(n!)

一般的に言えば、上記の関係はHackerrankなどのよくあるプラットフォームに適用されます。

あなたは入力の制約を使ってアルゴリズムを思いつくことができます。たとえば:あなたが0-32の制約を持つ問題を見た場合、ビットマスキング動的プログラミングを適用することを検討してください

Leetcode Premiumユーザー向け

私は1年間のLeetcodeプレミアムサブスクリプションを購入することを強くおすすめします。それは人生をもっとうまく運びます。確かに他のウェブサイトでプレミアム問題にアクセスしたり、多種多様なフォーラムやソースから企業に以前に尋ねられた質問を掘り出すことができますが、LCプレミアムはこれらの問題すべてをひと振りで解決します。

始めたばかりのあなたにLCプレミアムを買うことをおすすめしません。多くの高品質な問題がすでに無料で利用可能であり、多くの企業で尋ねられています。150〜200の問題を終え、数週間内に面接が組まれている場合は、LCプレミアムを買うことをおすすめします

頻度で問題を並び替える問題

LCプレミアムの最良の機能の一つは、「頻度」で問題を並び替えることができることです。しかし、それは両刃の剣です。
そこで示される「Frequency」は、実際には過去0-6ヶ月、0-1年、または1-2年の間に問題がどれくらいの頻度で尋ねられたかの数ではありません。Leetcodeは独自のアルゴリズムで頻度を計算しています。

このことについての投稿があります(リンクを提供した友人に感謝します)。

個人的には、最近よく尋ねられる質問を解くことこそが最良の準備方法だと思います(件数で)。

これを達成する方法は2つあります。

トピックと企業タグでフィルタリング

これにはエクセルシートが必要になります。全問題ページに移動します。最も頻繁に尋ねられる質問を知りたいトピック、例えばDFSを選んでから、企業を選択します。頻度の列をクリックして「最も頻繁に尋ねられる問題」で並び替えます。ここからが大変な部分です。

問題をクリックして新しいウィンドウで問題を開きます。スクロールダウンして最後に行くと、企業タブがあります。それを展開すると、頻度のカウントが見られます。以下のスクリーンショットを参照してください。

この場所で実際のカウントが分かります。問題のリンクをコピーし、頻度をメモしてください。面接の準備をするときは、最も高い頻度から低い頻度で解いてください。私は、最初のページにある全ての問題をクリックして、別のシートに頻度カウントを取り出すことをおすすめします。

企業固有の問題リスト

この方法はやや信頼性が高いと感じますが、トピック別に準備するのは難しいです。

全問題ページに移動して、カレンダーのちょうど右下をチェックしてください。

企業を検索するオプションがあります。希望する企業を検索してクリックします。スクリーンショットの下にあるようなビューに移動されます。

プロのヒント:https://leetcode.com/company/google/をタイプすればGoogleで尋ねられた問題にすばやく移動することができます

私は、上で説明した方法を使って、実際の頻度カウントで0-6ヶ月の範囲の問題を最初に解くことをおすすめします。

結論

私はこれらのステップを踏んでインタビュー合格のチャンスを高めてきましたし、あなたも今日新しいことを学んだと確信しています。

この記事に対するあらゆるコメント、考え、フィードバックを歓迎します。

次回まで、あなたの準備に幸運を祈ります。

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/dfs_with_memo/how-to-use-leetcode-effectively-2lgf