JavaScriptで文字列を配列の指定順序どおりにシャッフルする方法
本記事では、文字列 str を第一引数として、それと同じ長さの正の整数の配列 arr を第二引数として受け取る JavaScript 関数の実装方法を解説します。
この関数は、文字列内の文字を並べ替え(シャッフル)し、i 番目の位置にある文字が、シャッフル後の文字列の arr[i] 番目の位置へ移動するようにします。
入力例と期待される出力
たとえば、次の文字列と配列が与えられたとします。
const str = 'example'; const arr = [5, 2, 0, 6, 4, 1, 3];
この場合、期待される出力は次のとおりです。
const output = 'alxepem';
各文字がどのように移動するのかを整理すると、以下のようになります。
- 0番目の「e」→ 5番目へ(arr[0] = 5)
- 1番目の「x」→ 2番目へ(arr[1] = 2)
- 2番目の「a」→ 0番目へ(arr[2] = 0)
- 3番目の「m」→ 6番目へ(arr[3] = 6)
- 4番目の「p」→ 4番目へ(arr[4] = 4)
- 5番目の「l」→ 1番目へ(arr[5] = 1)
- 6番目の「e」→ 3番目へ(arr[6] = 3)
この結果、「example」は「alxepem」へと並べ替えられます。
サンプルコード
以下が実際のコード例です。
const str = 'example';
const arr = [5, 2, 0, 6, 4, 1, 3];
const shuffleString = (str = '', arr = []) => {
let res = '';
const map = new Map();
for (let i = 0; i < arr.length; i++) {
const char = str.charAt(i), index = arr[i]
map.set(index, char)
};
for (let i = 0; i < arr.length; i++){
res += map.get(i);
};
return res;
};
console.log(shuffleString(str, arr));出力結果
コンソールには次のように表示されます。
alxepem
コードの仕組み
このアルゴリズムの処理の流れは以下のとおりです。
- まず、文字の対応関係を保持するための空の Map を作成します。
- 最初のループでは、元の文字列の各インデックス i について、その位置の文字
charと移動先のインデックスindex = arr[i]をペアとして Map に登録します。 - 2つ目のループでは、インデックス 0 から順に Map から文字を取り出し、新しい文字列
resを組み立てていきます。 - 最後に、完成した文字列を返します。
このアプローチは O(n) の時間計算量で動作し、文字列を一度ずつ走査するだけで済むため非常に効率的です。なお、Map の代わりに長さ n の配列を事前に用意し、result[arr[i]] = str[i] と代入していく方法でも、まったく同じ結果を得られます。
-
【JavaScript】文字列から頭字語(アクロニム)を生成して返す方法
文字列を唯一の引数として受け取るJavaScript関数を作成する必要があります。 この関数は、引数として渡された文字列フレーズをもとに頭字語(アクロニム)を構築し、その結果を返します。 頭字語を構築する際のルールは、大文字で始まる単語のみを対象とすることです。小文字で始まる単語は頭字語に含めません。 例 たとえば、入力文字列が以下の場合を考えてみましょう。 const str = Polar Satellite Launch Vehicle; このとき、期待される出力は次のとおりです。 const output = PSLV; サンプルコード const str = Polar Sate
-
JavaScriptで配列の値に基づいて文字列の文字をシフトする方法
本記事では、小文字の英字のみで構成された文字列に対して、配列内の数値に従って各文字をシフトするJavaScript関数の実装方法を解説します。 問題の概要 まず、「1単位のシフト」を次のように定義します。ある文字を、アルファベット順でその直後の文字に置き換えること。これには循環(ラップアラウント)も含まれます。つまり、「z」の次の文字は「a」となります。 今回作成する関数は、以下の2つの引数を受け取ります。 str: 小文字英字のみを含む文字列(第1引数) arr: strと同じ長さを持つ数値の配列(第2引数) 関数は、元の文字列の各文字を、配列arr内の同じ位置にある数値の分だけ