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

【JavaScript】文字列の一意な文字を配列にマッピングする方法

JavaScriptで、文字列を受け取り、その各文字を0から始まる連番にマッピングする関数を作成してみましょう。ルールはシンプルです。初めて登場した文字(重複していない文字)に出会うたびにカウントを1つ増やし、すでに登場したことのある文字には同じ番号を割り当てます。

問題の例

たとえば、次のような文字列が与えられたとします。

const str = 'heeeyyyy';

この場合、期待される出力は以下のとおりです。

const output = [0, 1, 1, 1, 2, 2, 2, 2];

結果を見ると、「h」には0、「e」には1、「y」には2が割り当てられており、同じ文字が続く間は同じ番号が使われていることがわかります。

コード例

以下が実際のコードです。

const str = 'heeeyyyy';
const mapString = str => {
    const res = [];
    let curr = '', count = -1;
    for(let i = 0; i < str.length; i++){
       if(str[i] === curr){
          res.push(count);
       }else{
          count++;
          res.push(count);
          curr = str[i];
       };
    };
    return res;
};
console.log(mapString(str));

コードの仕組み

この関数では、次の3つの要素を使ってマッピングを行っています。

  • res:結果となる番号を格納する配列です。
  • curr:直前に処理した文字を記憶しておく変数です。初期値は空文字列です。
  • count:現在のマッピング番号を表します。初期値は -1 で、新しい文字が出るたびにインクリメントされるため、最初の文字には必ず 0 が割り当てられます。

ループの中では、現在の文字 str[i]curr と一致していれば、そのまま現在の count を配列に追加します。一致しない場合(=新しい文字が現れた場合)は、count を1増やしてから配列に追加し、curr を現在の文字で更新します。これにより、文字の切り替わりごとに番号が1つずつ増えていく仕組みです。

実行結果

コンソールには以下のように出力されます。

[
    0, 1, 1, 1,
    2, 2, 2, 2
]
  1. JavaScriptで配列内の唯一の異なる文字列を見つける方法

    問題 文字列の配列を受け取るJavaScript関数を作成する必要があります。配列内のすべての文字列は同じ文字(またはその並べ替え)で構成されていますが、ただ1つの文字列だけが異なる文字セットを含んでいます。この関数の目的は、その唯一の文字列を見つけ出して返すことです。 例: 次のような配列が与えられたとします。 [ba, abc, acb, bac, foo, bca, cab, cba] この場合、求めるべき文字列は「foo」です。 文字列には空白が含まれることがありますが、空白自体は意味を持たず、空白以外の記号のみが判定の対象となります。たとえば、空白だけで構成された文字列は空文字列と

  2. JavaScriptで文字列内の文字を英字・数字・特殊文字に再グループ化する方法

    問題文字列 str を第一引数(唯一の引数)として受け取る JavaScript 関数を作成する必要があります。この文字列には、次の3種類の文字が含まれる可能性があります。英字:(A-Z)、(a-z)数字:0〜9特殊文字:上記以外のすべての文字関数は文字列を先頭から順に走査し、ちょうど3つの要素からなる配列を構築します。1番目の要素には文字列に含まれるすべての英字、2番目には数字、3番目には特殊文字を格納し、それぞれ元の文字列内での出現順(相対的な順序)を維持します。最後にこの配列を返します。例えば、関数への入力が次の場合を考えてみましょう。入力const str = thi!1s is S@