【JavaScript】配列の数値を組み合わせて最大の数を作る方法
今回は、数値の配列を第一引数(唯一の引数)として受け取るJavaScript関数を作成します。この関数の役割は、配列内の数値を最適な順序で連結し、それらの数値から作り得る最大の数値を文字列として返すことです。
具体例
例えば、入力配列が次のような場合を考えてみましょう。
const arr = [5, 45, 34, 9, 3];
このとき、期待される出力は以下の通りです。
const output = '9545343';
注目すべき点として、単純に数値の大小で降順ソートするだけでは不十分なケースがあることが挙げられます。例えば「45」と「5」を比較すると、数値としては45の方が大きいですが、連結してできる数は「545」と「455」のどちらかであれば「545」の方が大きいため、実際には「5」を先に配置する必要があります。
解決のアプローチ
この問題の鍵となるのは、カスタム比較関数によるソートです。2つの数値aとbを比較する際、「ab」という順で連結した場合と「ba」という順で連結した場合の結果を比較し、より大きな数になる順序で並べ替えます。
また、配列のすべての要素が0である場合(例: [0, 0])は、そのまま連結すると「00」になってしまうため、特別に「0」を返す処理も必要になります。
コード例
const arr = [5, 45, 34, 9, 3];
const largestNumber = (arr = []) => {
// すべての要素が0の場合は「0」を返す
if(arr.every( n => n === 0)){
return '0';
}
arr.sort((a, b) => {
const s1 = new String(a);
const s2 = new String(b);
const first = s1 + s2;
const second = s2 + s1;
if(first > second){
return -1;
}else if(first < second){
return 1;
};
return 0;
});
return arr.join('');
};
console.log(largestNumber(arr));
実行結果
コンソールには以下のように出力されます。
9545343
コードの解説
1. ゼロのみの配列への対応
arr.every(n => n === 0) により、配列内のすべての要素が0かどうかを判定しています。すべて0の場合は、連結しても意味のない「000…」という文字列になるため、「0」を返します。
2. カスタム比較関数によるソート
比較関数の中では、まず2つの数値をそれぞれ文字列に変換します。そして、連結順序を入れ替えた2つのパターンを生成して比較します。例えば「5」と「45」の場合は以下のようになります。
- s1 + s2 → 「545」
- s2 + s1 → 「455」
「545」の方が大きいため、「5」が「45」より前に来るようにソートされます。これにより、全体として最大の数値が得られる順序が保証されます。
3. 結果の連結
最後に join('') を使って、ソート済みの全要素を区切り文字なしで連結すれば、最大の数値を表す文字列が完成します。
-
【初心者向け】JavaScriptのArray.from()メソッドの使い方を実例で解説
JavaScript の Array.from() メソッドは、length プロパティを持つオブジェクト(配列風オブジェクト)や、文字列・Map・Set などの反復可能(イテラブル)なオブジェクトから、新しい Array オブジェクトを生成して返すためのメソッドです。元のオブジェクトは変更されず、常に新しい配列インスタンスが返されます。 基本構文 Array.from(obj, mapFunction, val) パラメータの説明 obj:配列へ変換したい対象のオブジェクト。配列風オブジェクト(length プロパティを持つもの)や反復可能なオブジェクトを指定します。 mapFunctio
-
JavaScriptのArray.from()メソッドとは?使い方と実例をわかりやすく解説
Array.from()メソッドは、配列風オブジェクト(array-like)や反復可能オブジェクト(iterable)から、新しい配列オブジェクトを作成するための便利なメソッドです。文字列、Map、Set、NodeListなど、さまざまなデータを手軽に配列へ変換できます。 Array.from()の基本的な動作 例えば、文字列「HelloWorld」に対してArray.from()を使用すると、1文字ずつ分割された新しい配列が生成されます。以下に実際のコード例を示します。 サンプルコード <!DOCTYPE html> <html lang="ja"&g