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

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));

仕組みの解説

このアルゴリズムは、以下の手順で動作します。

  1. 総文字数の算出: カンマを除去した状態の文字列長を計算し、完成させる単語の目標の長さとします。
  2. 比較関数 sorter の定義: 空文字列や null を考慮しながら、文字列同士を辞書順に比較するカスタムソート関数です。
  3. 初期ソート: 文字列をカンマで分割して配列化し、各単語を辞書順にソートします。
  4. ループ処理: 先頭の単語から1文字ずつ取り出して結果に連結し、残った単語をその都度再ソートします。すべての文字を使い切るまで繰り返します。

この処理により、毎回全体で最小のアルファベットが優先的に選ばれるため、条件を満たす新しい単語が正しく組み上がります。

出力結果

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

AAAJAKOPPLEROBY
  1. マジックストリング(魔法の文字列)問題を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」の

  2. JavaScriptで文字列を出現頻度の高い順に並べ替える方法

    問題 文字列を唯一の引数として受け取るJavaScript関数を作成します。 この関数は、元の文字列をもとに新しい文字列を生成し、出現回数が最も多い文字を先頭に配置し、以降は出現頻度の高い順(降順)に残りの文字を並べる必要があります。 たとえば、関数への入力が次の場合: const str = free; 出力は次のようになります。 const output = eefr; 出力の解説 eは2回出現するため先頭に配置され、その後に出現回数が1回ずつのfとrが続きます。 サンプルコード この問題を解くコードは以下の通りです。 const str = free; const frequency