JavaScriptで数値の各で数値の各桁を昇順に並べ替える方法
問題の概要
数値の配列を受け取り、その中のすべての数値について、各桁の数字を内部で特定の順序(この記事では昇順とします)に並べ替えるJavaScript関数を作成する必要があります。
たとえば、次のような配列があったとしましょう。
const arr = [543, 65, 343, 75, 567, 878, 87];
この場合、期待される出力は次のようになります。それぞれの数値の桁が昇順に並べ替えられている点に注目してください。
const output = ['345', '56', '334', '57', '567', '788', '78'];
実装コード
それでは、実際のコードを見ていきましょう。
const arr = [543, 65, 343, 75, 567, 878, 87];
// 各桁を昇順に並べ替えた結果を返す関数
const ascendNumber = num => {
const numArr = String(num).split('').map(el => +el);
numArr.sort((a, b) => a - b);
return numArr.join('');
};
// 配列内のすべての数値に対して処理を適用する関数
const sortDigits = arr => {
const res = [];
for(let i = 0; i < arr.length; i++){
res.push(ascendNumber(arr[i]));
};
return res;
};
console.log(sortDigits(arr));コードの解説
このコードの仕組みを順を追って確認してみましょう。
- String(num).split(''):数値を一度文字列に変換し、1桁ずつ要素に分解した配列を作成します。
- map(el => +el):単項プラス演算子(+)を使って、各要素を文字列から数値型へ変換し直します。
- sort((a, b) => a - b):比較関数を明示的に指定することで、文字列比較ではなく数値として正しく昇順ソートを行います。
- join(''):並べ替えた数字を区切り文字なしで連結し、1つの文字列として返します。
なお、join('') の仕様上、戻り値は文字列になります。数値として後続の計算に使いたい場合は、+ascendNumber(num) のように Number() や単項プラスで変換するとよいでしょう。
また、forループの代わりに Array.prototype.map() を使えば、より簡潔に記述できます。
const sortDigits = arr => arr.map(ascendNumber);
出力結果
コンソールには次のように表示されます。
[
'345', '56',
'334', '57',
'567', '788',
'78'
]このように、文字列への変換・分割・ソート・結合というシンプルな処理の組み合わせだけで、数値の各桁を自在に並べ替えることができます。降順にしたい場合は、比較関数を (a, b) => b - a に変更するだけで対応可能です。
-
JavaScriptで数字列の中から最大の5桁の連続数字を見つける方法
問題少なくとも5桁以上の数字で構成される文字列を受け取るJavaScript関数を作成する必要があります。この関数は、与えられた数字列の中に含まれる「連続する5桁」の中で最も大きな数値を返さなければなりません。たとえば、入力が 123546544 の場合、取りうる5桁の組み合わせは「12354」「23546」「35465」「54654」「46544」となり、この中で最大のものは 54654 です。解決アプローチ考え方はシンプルです。文字列を先頭から1文字ずつずらしながら、5文字分を切り出す切り出したすべての5桁の部分文字列を配列に格納するMath.max() を使って最大値を求めるJavaSc
-
JavaScriptで指定した範囲内にある「ある数で割り切れる数」の個数を求める方法
問題2つの整数からなる範囲(配列)を第1引数に、1つの数値を第2引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在する「入力された数値で割り切れる数」をすべて見つけ、その合計個数を返します。サンプルコード以下がその実装例です。const range = [6, 57]; const num = 3; const findDivisibleCount = (num = 1, [l, h]) => { let count = 0; for(let i = l; i <= h; i++