今年の 9 月、私は自らに課した 30 日間のコード チャレンジに着手しました。これは、毎日少なくとも 2 つのデータ構造とアルゴリズム (DSA) の問題を解決するという取り組みです。私の目標は、自分自身を快適ゾーンから押し出し、一貫性を築き、問題解決スキルとプログラミング ロジックを向上させることでした。
私は 1 つのプラットフォームだけに固執したわけではありません。HackerRank の 30 日間のコード チャレンジ、LeetCode の 30 日間の JavaScript プランを完了し、また、LeetCode の Top Interview 150 トラック (面接の準備をしている人向けの 150 の典型的な面接の問題を集めたもの) にも取り組みました。コーディングインタビュー。さらに、DSA の概念の理解をさらに強化するために、Structy に関するレッスンをいくつか受講しました。
私は JavaScript を使用してほとんどの問題を解決しました (JavaScript がサポートされていなかったため、代わりに Python を使用したいくつかの HackerRank 問題を除いて)。自分自身に責任を持たせるため、また自分の進捗状況を共有するために、毎日解決した課題を Twitter に投稿しました。それらは次の引用履歴で見つけることができます:
私は毎日、さまざまな種類のデータ構造とアルゴリズムに触れました。
一部の問題には、リンク リストやバイナリ ツリーなどのより複雑な構造が含まれていましたが、他の問題には行列や n 次元配列が混入しており、多次元空間を扱うことができました。
問題の多様性に私は目が離せませんでした。 LeetCode の 30 日間の JavaScript トラックの問題は、
LeetCode の Top Interview 150 トラックはさらに一歩進んで、さまざまな難易度やアプローチの問題の間で私を翻弄しました。毎日これらのうち少なくとも 1 つを解決することは非常に貴重でした。また、これらの問題により、最適化について、また、さまざまなアプローチが実行時間とメモリ効率にどのように大きな影響を与える可能性があるかについて、より頻繁に考えるようになりました。
私はこれらの課題と並行して Structy のレッスンも受講し、主要な概念の理解を強化しました。リンク リストやバイナリ ツリーのセクションなど、一部のデータ構造を処理するより効率的な方法を学びました。私は特に、理解しやすい方法で問題を教え、分解するというプラットフォームのダイナミックなアプローチを高く評価するようになりました。これは、DSA を非常に基本的なレベルで学習し、この理解を私が直面する他のコーディングの問題に応用するのに最適なプラットフォームです。
日が経つにつれて、私はさまざまな種類の解決策のアプローチ、次のような問題解決手法に出会いました。
2 ポインタ アプローチは、より効率的な解決策を得るために検索スペースを削減することで、シーケンス (主に配列と文字列) に関連する問題を解決するための単純かつ強力な方法であることがわかりました。また、各ステップで局所的に最適な選択を行う必要がある貪欲なアルゴリズムも使用しました。
スライディング ウィンドウ手法もまた目を見張るものでした。最初は難しかったですが、部分配列や部分文字列が関係する問題には価値がありました。シーケンス内の要素の移動範囲を追跡する必要がある問題。ハッシュマップとハッシュテーブルは、頻繁な検索を伴う問題のキーと値のペアに最適です。
私が取り組んだ最も複雑なテクニックの 1 つは動的プログラミングでした。初期の頃、重複する部分問題を認識するのが難しいため、DP は非常に恐ろしいものだと感じましたが、繰り返し使用するうちに、メモ化は再帰呼び出しの最適化において私の親友になりました。
DSA の中核的な問題に加えて、より高度な JavaScript の概念を試す機会も得られました。コードのフローを制御し、特定の要件に合わせて機能を拡張する方法を学びながら、ラッパー関数を作成しました。関数にタイマーを設定する方法も学びました。これにより、時間に敏感な操作を処理したり、特定の関数の実行頻度を制限したりすることができます。
プロトタイプを使って作業すると、カスタム メソッドを作成することで、データ型が組み込みの機能を超えて操作できることがわかりました。これにより、オブジェクトや配列などのデータ型の組み込み機能を新しい方法で拡張できるようになりました。クリーンでモジュール化されたコードを書くことの重要性を理解するようになりました。<script> // Detect dark theme var iframe = document.getElementById('tweet-1840720685099864068-290'); if (document.body.className.includes('dark-theme')) { iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1840720685099864068&theme=dark" } </script>
我還學習了記憶化,這是一種修改函數以儲存先前呼叫的參數及其結果的技術!這是一種緩存,有助於提高多次調用相同函數的問題的效能。我在這裡寫了關於我的 Memoize 解決方案擊敗 99%(內存)的文章:Memoize 直觀解決方案擊敗 99% 內存。
在這段旅程中我開始更加關注的另一件事是我的程式碼的最佳化。在正確介紹了 Structy 上的大 O 表示法之後,我了解時間和空間複雜性的重要性,並學會了解決最常見問題的最佳技術。在 HackerRank 挑戰賽接近尾聲時,我還學會了使用類別測試程式碼並編寫泛型。
當我完成 30 天程式設計挑戰時,我感受到了深刻的成長感。它提高了我處理各種問題的能力,加深了我對 JavaScript 和 DSA 的理解。這一個月的旅程不只是解決問題,還提醒自己,我真的可以付出努力。看到一致性和紀律的回報,我的心態得到了更新,可以充滿信心和強大的技術工具包來應對任何挑戰。
這次經歷標誌著我程式設計之旅的一個重要里程碑。我在這 30 天裡磨練的技能無疑將延續到我作為軟體工程師的職業生涯。
我為自己付出的努力感到自豪,也感謝在整個挑戰過程中為我加油、提供支持和智慧的朋友們。
以上が#aysofCode 9 月: DSA マスタリーへの私の旅の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。