データ型、基本から高度まで

私は毎日、さまざまな種類のデータ構造とアルゴリズムに触れました。

の扱い方を学びました

リンク リストやバイナリ ツリーなどのより複雑な構造を伴う問題もあれば、行列や n 次元配列を混ぜて多次元空間を扱うことができる問題もありました。

問題の多様性に私は目が離せませんでした。 LeetCode の 30 日間の JavaScript トラックの問題は、

のような基礎を教えてくれました。

LeetCode の Top Interview 150 トラックはさらに一歩進んで、さまざまな難易度やアプローチの問題の間で私を翻弄しました。毎日これらのうち少なくとも 1 つを解決することは非常に貴重でした。また、これらの問題により、最適化について、また、さまざまなアプローチが実行時間とメモリ効率にどのように大きな影響を与える可能性があるかについて、より頻繁に考えるようになりました。

私はこれらの課題と並行して Structy のレッスンも受講して、主要な概念の理解を強化しました。リンク リストやバイナリ ツリーのセクションなど、一部のデータ構造を処理するより効率的な方法を学びました。私は特に、理解しやすい方法で問題を教え、分解するというプラットフォームのダイナミックなアプローチを高く評価するようになりました。これは、非常に基本的なレベルで DSA を学習し、この理解を私が直面する他のコーディングの問題に応用するのに最適なプラットフォームです。

アプローチとテクニック

日が経つにつれて、私はさまざまな種類の解決策のアプローチや問題解決手法に出会いました。

2 ポインター アプローチは、より効率的な解決策を得るために検索スペースを削減することで、シーケンス (主に配列と文字列) に関連する問題を解決するための単純かつ強力な方法であることがわかりました。また、各ステップで局所的に最適な選択を行う必要がある貪欲なアルゴリズムも使用しました。

スライディング ウィンドウ手法もまた目を見張るものでした。最初は難しかったですが、部分配列や部分文字列が関係する問題には価値がありました。シーケンス内の要素の移動範囲を追跡する必要がある問題。ハッシュマップとハッシュテーブルは、頻繁な検索を伴う問題のキーと値のペアに最適です。

私が取り組んだ最も複雑なテクニックの 1 つは動的プログラミングでした。初期の私は、重複する部分問題を認識するのが難しいため、DP は非常に恐ろしいと感じましたが、繰り返し使用するうちに、メモ化は再帰呼び出しの最適化において私の親友になりました。

関数操作 (feat. ラッパーとプロトタイプ)

DSA の中核的な問題に加えて、より高度な JavaScript の概念を試す機会も得られました。コードのフローを制御し、特定の要件に合わせて機能を拡張する方法を学びながら、ラッパー関数を作成しました。関数にタイマーを設定する方法も学びました。これにより、時間に敏感な操作を処理したり、特定の関数の実行頻度を制限したりすることができます。

プロトタイプを扱うことで、カスタム メソッドを作成することで、データ型が組み込みの機能を超えて操作できることがわかりました。これにより、オブジェクトや配列などのデータ型の組み込み機能を新しい方法で拡張できるようになりました。クリーンでモジュール化されたコードを書くことの重要性を理解するようになりました。

また、メモ化という、以前に呼び出された引数とその結果を格納するように関数を変更するテクニックも学びました。これは一種のキャッシュであり、同じ関数への呼び出しが複数ある場合に問題のパフォーマンスを向上させるのに役立ちます。 99% (メモリ) を達成した Memoize ソリューションについては、ここに書きました: Memoize Intuitive Solution Beats 99% Memory.

テストと最適化

この旅の中で私がさらに注意を払い始めたのは、コードの最適化でした。 Structy で big-O 記法を適切に紹介した後、時間と空間の複雑さの重要性を理解し、最も一般的な問題に最適なテクニックを学びました。 HackerRank チャレンジ トラックの終わりに近づくにつれて、クラスを使用してコードをテストし、ジェネリックを記述することも学びました。

取り除く

30 日間のコード チャレンジを完了するまでに、私は深い成長を感じました。これにより、さまざまな問題に対処する能力が向上し、JavaScript と DSA についての理解が深まりました。この 1 か月にわたる旅は、単に問題を解決するだけでなく、自分が本当に努力できることを思い出させてくれました。一貫性と規律が得られるものを見て、私は自信を持って、強力なテクニックのツールキットを使って、どんな課題にも取り組むという考え方を新たにしました。

この経験は、私のプログラミングの旅における重要なマイルストーンです。この 30 日間で磨いたスキルは、間違いなくソフトウェア エンジニアとしての私のキャリアに引き継がれるでしょう。

私は努力を続けてきた自分を誇りに思います。そして、この挑戦​​を通して私を応援し、サポートと知恵を提供してくれた友人たちに感謝しています。

\\\"#aysofCode

","image":"http://www.luping.net/uploads/20241006/172818757367020cb51a890.jpg","datePublished":"2024-11-07T22:11:52+08:00","dateModified":"2024-11-07T22:11:52+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > #aysofCode 9 月: DSA マスタリーへの私の旅

#aysofCode 9 月: DSA マスタリーへの私の旅

2024 年 11 月 7 日に公開
ブラウズ:436

今年の 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 トラックの問題は、

のような基礎を教えてくれました。
  • 配列変換
  • 関数変換
  • 閉鎖
  • クラス
  • JSON
  • 約束と時間。

LeetCode の Top Interview 150 トラックはさらに一歩進んで、さまざまな難易度やアプローチの問題の間で私を翻弄しました。毎日これらのうち少なくとも 1 つを解決することは非常に貴重でした。また、これらの問題により、最適化について、また、さまざまなアプローチが実行時間とメモリ効率にどのように大きな影響を与える可能性があるかについて、より頻繁に考えるようになりました。

私はこれらの課題と並行して Structy のレッスンも受講して、主要な概念の理解を強化しました。リンク リストやバイナリ ツリーのセクションなど、一部のデータ構造を処理するより効率的な方法を学びました。私は特に、理解しやすい方法で問題を教え、分解するというプラットフォームのダイナミックなアプローチを高く評価するようになりました。これは、非常に基本的なレベルで DSA を学習し、この理解を私が直面する他のコーディングの問題に応用するのに最適なプラットフォームです。

アプローチとテクニック

日が経つにつれて、私はさまざまな種類の解決策のアプローチや問題解決手法に出会いました。

  • 再帰
  • ツーポインタ
  • ハッシュマップ
  • ハッシュテーブル
  • 貪欲なアルゴリズム
  • 二分探索
  • 引き違い窓
  • 動的プログラミング
  • キャッシュ (メモ化) など。

2 ポインター アプローチは、より効率的な解決策を得るために検索スペースを削減することで、シーケンス (主に配列と文字列) に関連する問題を解決するための単純かつ強力な方法であることがわかりました。また、各ステップで局所的に最適な選択を行う必要がある貪欲なアルゴリズムも使用しました。

スライディング ウィンドウ手法もまた目を見張るものでした。最初は難しかったですが、部分配列や部分文字列が関係する問題には価値がありました。シーケンス内の要素の移動範囲を追跡する必要がある問題。ハッシュマップとハッシュテーブルは、頻繁な検索を伴う問題のキーと値のペアに最適です。

私が取り組んだ最も複雑なテクニックの 1 つは動的プログラミングでした。初期の私は、重複する部分問題を認識するのが難しいため、DP は非常に恐ろしいと感じましたが、繰り返し使用するうちに、メモ化は再帰呼び出しの最適化において私の親友になりました。

関数操作 (feat. ラッパーとプロトタイプ)

DSA の中核的な問題に加えて、より高度な JavaScript の概念を試す機会も得られました。コードのフローを制御し、特定の要件に合わせて機能を拡張する方法を学びながら、ラッパー関数を作成しました。関数にタイマーを設定する方法も学びました。これにより、時間に敏感な操作を処理したり、特定の関数の実行頻度を制限したりすることができます。

プロトタイプを扱うことで、カスタム メソッドを作成することで、データ型が組み込みの機能を超えて操作できることがわかりました。これにより、オブジェクトや配列などのデータ型の組み込み機能を新しい方法で拡張できるようになりました。クリーンでモジュール化されたコードを書くことの重要性を理解するようになりました。

また、メモ化という、以前に呼び出された引数とその結果を格納するように関数を変更するテクニックも学びました。これは一種のキャッシュであり、同じ関数への呼び出しが複数ある場合に問題のパフォーマンスを向上させるのに役立ちます。 99% (メモリ) を達成した Memoize ソリューションについては、ここに書きました: Memoize Intuitive Solution Beats 99% Memory.

テストと最適化

この旅の中で私がさらに注意を払い始めたのは、コードの最適化でした。 Structy で big-O 記法を適切に紹介した後、時間と空間の複雑さの重要性を理解し、最も一般的な問題に最適なテクニックを学びました。 HackerRank チャレンジ トラックの終わりに近づくにつれて、クラスを使用してコードをテストし、ジェネリックを記述することも学びました。

取り除く

30 日間のコード チャレンジを完了するまでに、私は深い成長を感じました。これにより、さまざまな問題に対処する能力が向上し、JavaScript と DSA についての理解が深まりました。この 1 か月にわたる旅は、単に問題を解決するだけでなく、自分が本当に努力できることを思い出させてくれました。一貫性と規律が得られるものを見て、私は自信を持って、強力なテクニックのツールキットを使って、どんな課題にも取り組むという考え方を新たにしました。

この経験は、私のプログラミングの旅における重要なマイルストーンです。この 30 日間で磨いたスキルは、間違いなくソフトウェア エンジニアとしての私のキャリアに引き継がれるでしょう。

私は努力を続けてきた自分を誇りに思います。そして、この挑戦​​を通して私を応援し、サポートと知恵を提供してくれた友人たちに感謝しています。

#aysofCode September: My journey to DSA Mastery

リリースステートメント この記事は、https://dev.to/akcumeh/30daysofcode-september-my-journey-todsa-mastery-647?1に再現されています。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3