JavaScriptで文字列内のアルファベットを並べ替える方法
問題の概要
たとえば、次のようなカンマ区切りの単語列があるとします。
const str = 'JAY, ROB';
ここで求められるのは、このような文字列を引数として受け取るJavaScript関数を作成することです。この関数は、文字列内の各単語の文字を使い、「前のアルファベットが常に次のアルファベット以上になる」(たとえば A は B より大きい)という条件を満たす新しい単語を組み立てます。
上記の例で言えば、まず「JAY」の1文字目と「ROB」の1文字目を比較します。
J は R よりも前に位置するため、新しい単語の1文字目は J になります。続いて2文字目を比較すると、A は R より先に来るため2文字目が A となり、同様に3文字目は R になります。
このようにして、最終的に完成する単語は「JAROBY」となります。
なお、この例では2単語の文字列を使用しましたが、実際には3単語以上の場合にも正しく動作する汎用的なソリューションを作成する必要があります。
コード例
実装コードは以下のとおりです。
const str = `JAY,ROB,APPLE,AAKO`;
const specialSort = (str = '') => {
let len = str.replace(/,/g, "").length;
const sorter = (str, b) => {
if(str === "" || str === null) return 1;
if(b === "" || b === null) return −1;
if(str === b) return 0;
return str < b ? −1 : 1;
};
let res = "";
let sorted = str.split(",").sort(sorter);
while (res.length < len){
res += sorted[0][0];
sorted[0] = sorted[0].slice(1);
sorted = sorted.sort(sorter);
}
return res;
};
console.log(specialSort(str));
仕組みの解説
このアルゴリズムは、以下の手順で動作します。
- 総文字数の算出: カンマを除去した状態の文字列長を計算し、完成させる単語の目標の長さとします。
- 比較関数 sorter の定義: 空文字列や null を考慮しながら、文字列同士を辞書順に比較するカスタムソート関数です。
- 初期ソート: 文字列をカンマで分割して配列化し、各単語を辞書順にソートします。
- ループ処理: 先頭の単語から1文字ずつ取り出して結果に連結し、残った単語をその都度再ソートします。すべての文字を使い切るまで繰り返します。
この処理により、毎回全体で最小のアルファベットが優先的に選ばれるため、条件を満たす新しい単語が正しく組み上がります。
出力結果
コンソールには次のように出力されます。
AAAJAKOPPLEROBY
-
マジックストリング(魔法の文字列)問題をJavaScriptで解く方法
マジックストリングの問題概要マジックストリング(魔法の文字列)とは、「1」と「2」だけから構成され、次の性質を持つ特別な文字列です。この文字列が「マジック(魔法)」と呼ばれるのは、連続する「1」や「2」のかたまり(グループ)ごとの出現回数をつなぎ合わせると、元の文字列そのものが再現されるからです。文字列 str の最初の部分は次のようになっています。str = 1221121221221121122……str 内の連続した「1」「2」をそれぞれグループに分けると、次のようになります。1 22 11 2 1 22 1 22 11 2 11 22 ……さらに、各グループにおける「1」または「2」の
-
JavaScriptで文字列を出現頻度の高い順に並べ替える方法
問題 文字列を唯一の引数として受け取るJavaScript関数を作成します。 この関数は、元の文字列をもとに新しい文字列を生成し、出現回数が最も多い文字を先頭に配置し、以降は出現頻度の高い順(降順)に残りの文字を並べる必要があります。 たとえば、関数への入力が次の場合: const str = free; 出力は次のようになります。 const output = eefr; 出力の解説 eは2回出現するため先頭に配置され、その後に出現回数が1回ずつのfとrが続きます。 サンプルコード この問題を解くコードは以下の通りです。 const str = free; const frequency