「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Typescript コーディング クロニクル: 文字列圧縮

Typescript コーディング クロニクル: 文字列圧縮

2024 年 8 月 23 日に公開
ブラウズ:603

Typescript Coding Chronicles: String Compression

問題の説明:

文字 char の配列を指定すると、次のアルゴリズムを使用して圧縮します:

  • 空の文字列 s.
  • で始まります。
  • chars 内の連続して繰り返される文字の各グループについて:
    • グループの長さが 1 の場合、文字を s に追加します。
    • それ以外の場合は、文字の後にグループの長さを追加します。

圧縮文字列 s は個別に返されるのではなく、入力文字配列 chars に格納される必要があります。グループ長が 10 以上の場合、chars.

内の複数の文字に分割されることに注意してください。

入力配列の変更が完了したら、配列の新しい長さを返します。

一定の追加スペースのみを使用するアルゴリズムを作成する必要があります。

例 1:

  • 入力: 文字 = ["a","a","b","b","c","c","c"]
  • 出力: 6 を返します。入力配列の最初の 6 文字は次のようになります: ["a","2","b","2","c","3"]
  • 説明: グループは「aa」、「bb」、および「ccc」です。これは「a2b2c3」に圧縮されます。

例 2:

  • 入力: 文字 = ["a"]
  • 出力: 1 を返します。入力配列の最初の文字は ["a"] になります。
  • 説明: 唯一のグループは「a」ですが、これは単一文字であるため圧縮されません。

例 3:

  • 入力: chars = ["a","b","b","b","b","b","b","b","b","b","b "、"b"、"b"]
  • 出力: 4 を返します。入力配列の最初の 4 文字は次のようになります: ["a","b","1","2"]
  • 説明: グループは「a」と「bbbbbbbbbbbb」です。これは「ab12」に圧縮されます。

制約:

  • 1
  • chars[i] は、英小文字、英大文字、数字、または記号です。

最初の思考プロセス:

この問題を解決するには、現在の文字とその数を追跡しながら配列を反復処理する必要があります。新しい文字に遭遇すると、現在の文字とその数 (1 より大きい場合) を配列に追加します。スペースの複雑さの要件を満たすために、これを確実に実行する必要があります。

基本的な解決策 (総当たり):

ブルート フォース ソリューションでは、入力配列の圧縮バージョンを格納するための新しい配列を作成します。これはスペース効率は良くありませんが、必要な手順を理解するのに役立ちます。

コード:

function compressBruteForce(chars: string[]): number {
    const n = chars.length;
    let compressed: string[] = [];
    let i = 0;

    while (i  1) {
            compressed.push(...count.toString().split(''));
        }
    }

    for (let j = 0; j 



時間計算量の分析:

  • 時間計算量: O(n)、n は配列の長さです。文字数をカウントするために配列を 1 回反復し、結果を書き込むために 1 回反復します。
  • 空間複雑度: O(n)、圧縮配列に余分な空間を使用するため。

制限事項:

ブルート フォース ソリューションはスペース効率が悪く、一定の追加スペースのみを使用するという制約を満たしていません。

最適化されたソリューション:

最適化されたソリューションには、圧縮バージョンを保存するために入力配列を適切に変更することが含まれます。 2 つのポインターを使用します。1 つは入力配列の読み取り用、もう 1 つは圧縮出力の書き込み用です。

コード:

function compress(chars: string[]): number {
    let writeIndex = 0;
    let i = 0;

    while (i  1) {
            let countStr = count.toString();
            for (let j = 0; j 



時間計算量の分析:

  • 時間計算量: O(n)、n は配列の長さです。文字数をカウントするために配列を 1 回反復し、結果を書き込むために 1 回反復します。
  • 空間複雑度: O(1)。変数には一定量の追加空間のみを使用するため。

基本的なソリューションの改善点:

  • 最適化されたソリューションは、入力配列を適切に変更することで空間の複雑さを O(1) に削減します。

エッジケースとテスト:

エッジケース:

  1. 配列には 1 文字だけが含まれています。
  2. 配列には連続する繰り返し文字が含まれていません。
  3. 配列には、連続して繰り返される文字が多数含まれています。

テストケース:

console.log(compressBruteForce(["a","a","b","b","c","c","c"])); // 6, ["a","2","b","2","c","3"]
console.log(compressBruteForce(["a"])); // 1, ["a"]
console.log(compressBruteForce(["a","b","b","b","b","b","b","b","b","b","b","b","b"])); // 4, ["a","b","1","2"]
console.log(compressBruteForce(["a","a","a","a","a","a","a","a","a","a"])); // 3, ["a","1","0"]
console.log(compressBruteForce(["a","b","c"])); // 3, ["a","b","c"]

console.log(compress(["a","a","b","b","c","c","c"])); // 6, ["a","2","b","2","c","3"]
console.log(compress(["a"])); // 1, ["a"]
console.log(compress(["a","b","b","b","b","b","b","b","b","b","b","b","b"])); // 4, ["a","b","1","2"]
console.log(compress(["a","a","a","a","a","a","a","a","a","a"])); // 3, ["a","1","0"]
console.log(compress(["a","b","c"])); // 3, ["a","b","c"]

一般的な問題解決戦略:

  1. 問題を理解する: 問題の説明を注意深く読み、要件と制約を理解します。
  2. キー操作の特定: 連続する文字のカウントや配列の適切な変更など、必要なキー操作を決定します。
  3. 効率を最適化: 効率的なアルゴリズムとデータ構造を使用して、時間と空間の複雑さを最小限に抑えます。
  4. 徹底的にテストする: エッジ ケースを含むさまざまなケースでソリューションをテストし、正確さを確認します。

同様の問題を特定する:

  1. 文字列操作:

    • 特定の条件に基づいて文字列を変更する必要がある問題。
    • 例: 文字列から重複を削除します。
  2. インプレース アルゴリズム:

    • 限られた追加スペースで操作を適切な場所で実行する必要がある問題。
    • 例: 余分なスペースを含まずに配列から要素を削除します。

結論:

  • 文字配列の圧縮の問題は、総当たりアプローチと最適化されたインプレース アプローチの両方を使用して効率的に解決できます。
  • 問題を理解し、管理可能な部分に分割することが重要です。
  • 効率的なアルゴリズムを使用することで、大規模な入力に対してソリューションが最適になることが保証されます。
  • さまざまなエッジケースでのテストにより、堅牢性が保証されます。
  • 問題のパターンを認識すると、同様の解決策を他の課題に適用するのに役立ちます。

このような問題と戦略を実践することで、問題解決スキルを向上させ、さまざまなコーディングの課題に対する準備を整えることができます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/__zamora__/typescript-coding-chronicles-string-compression-42k5?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

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

Copyright© 2022 湘ICP备2022001581号-3