JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで文字列内の繰り返し文字をカウントして出力する方法

例えば、次のような文字列があるとします。

const str = 'aabbcde';

この文字列には、aが2つ、bが2つ、そしてc・d・eがそれぞれ1つずつ含まれています。

ここで求められているのは、このような文字列を受け取るJavaScript関数を作成することです。関数は「文字の出現回数+その文字」という形式で構成された新しい文字列を生成して返す必要があります。

したがって、上記の文字列の場合、期待される出力は次のようになります。

const output = '2a2b1c1d1e';

実装例

この問題を解く基本的なアプローチは以下の通りです。

  1. 文字列を1文字ずつに分割し、sort()でアルファベット順に並べ替えることで、同じ文字同士が必ず隣接するようにします。
  2. 配列を先頭から走査し、隣り合う文字を比較しながら、同じ文字が連続している個数をカウントします。
  3. 別の文字が出現したタイミングで、「カウント数+その文字」を結果の文字列に追記し、カウントをリセットします。
  4. ループ終了後、最後の文字グループも忘れずに結果へ追加します。

実際のコードは以下のようになります。

const str = 'aabbcde';
const repeatLetter = (str = '') => {
    const strArr = str.split("").sort();
    let count = 1;
    let i = 1;
    let res = '';
    while (i < strArr.length) {
        if (strArr[i - 1] === strArr[i]) { count++; }
        else {
            res += count + strArr[i - 1];
            count = 1;
        };
        i++;
    };
    res += count + strArr[i - 1];
    return res;
};
console.log(repeatLetter(str));

出力結果

このコードを実行すると、コンソールには以下のように表示されます。

2a2b1c1d1e

処理の流れのポイント

  • ソートの重要性: split("")で分割しただけでは元の並び順のままなので、sort()によって同一文字をまとめるのがポイントです。
  • 最後のグループの扱い: whileループは最後の文字まで到達する前に終了するため、ループ後にres += count + strArr[i - 1]で残りのグループを追加しています。
  • 数値と文字列の結合: count + strArr[i - 1]では、文字列との連結により数値が自動的に文字列化され、意図した形式の出力が得られます。
  1. JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説

    JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>

  2. JavaScriptのconstとletの違いを徹底解説!ブロックスコープ変数の基本と使い方

    JavaScriptにおけるconstとletの基本const と let は、ES2015(ES6)で導入された変数宣言用のキーワードです。どちらもブロックスコープ(波括弧 { } で囲まれた範囲)に対応しているのが特徴で、関数スコープしか持たなかった従来の var とは異なる挙動を示します。両者の大きな違いは再代入の可否です。letで宣言した変数は後から何度でも値を再代入できますが、constで宣言した変数は再代入しようとするとエラー(TypeError)が発生します。letとconstの主な違い項目letconst再代入可能不可(エラー発生)スコープブロックスコープブロックスコープ宣言時