JavaScriptで数字を回転させて最大の数を取得する方法
問題
正の整数 n を引数として受け取り、その数字の桁を回転させることで得られる数の中から最大の数を返すJavaScript関数を作成します。ここでは、数値を1桁ずつに分解した配列を操作しながら複数の候補を生成し、その都度比較を行うことで最大値を導き出します。
サンプルコード
以下のコードをご覧ください。
const num = 56789;
const findMaximum = (num = 1) => {
let splitNumbers = num.toString().split("");
let largestNumber = num;
for(let i = 0; i < splitNumbers.length - 1; i++) {
splitNumbers.push(splitNumbers.splice(i, 1)[0]);
let newNumber = Number(splitNumbers.join(""));
if(newNumber >= largestNumber) {
largestNumber = newNumber;
}
};
return largestNumber;
};
console.log(findMaximum(num));
出力
68957
コードの解説
処理の流れは以下のとおりです。
まず、num.toString().split("") の部分で数値を文字列に変換し、さらに1桁ずつ要素に分解した配列を作成します。このとき、比較用の初期値として元の数値そのものを最大値(largestNumber)に設定しておきます。
続いてforループの中で、splitNumbers.splice(i, 1)[0] によりインデックス i の位置にある桁を配列から取り除き、その桁を push() で配列の末尾に移動させます。この操作によって桁の並び順が変わり、新しい候補となる数が生まれます。
その後、splitNumbers.join("") で配列の要素を連結して文字列を組み立て、Number() で数値に変換します。新しくできた数が現在の最大値以上であれば、largestNumber を新しい値で更新していきます。
ループは「桁数 − 1」回だけ繰り返されます。最後に largestNumber に残っている値が答えとなり、例では 56789 から候補を順に生成した結果、最大値である 68957 が出力されました。
使用している主なメソッド
split():文字列を指定した区切り文字で分割し、配列を返します。空文字 "" を渡すと1文字ずつ分割できます。
splice():配列から指定位置の要素を取り除き、取り除いた要素を返します。
push():配列の末尾に要素を追加します。
join():配列の全要素を連結して1つの文字列を返します。
Number():文字列などの値を数値に変換します。
なお、この手法の計算量は桁数を d とすると O(d²) 程度になります。splice や join のたびに配列・文字列の再構築が行われるためです。とはいえ日常的な規模の数値であれば十分実用的で、「桁の並び替えから最大値を求める」という問題の考え方を学ぶのに適したシンプルな実装といえます。
-
JavaScriptで数値の各桁の数字を一つずつ分割表示する方法
はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html> <head> &n
-
JavaScriptで単調増加する桁を持つ、指定した数以下の最大の数を求める方法
単調増加する桁(Monotonically Increasing Digits)とは 整数が「単調増加する桁」を持つとは、隣り合う任意の2つの桁 x と y の間に、常に x <= y が成り立つことを指します。たとえば 1234 や 2299 は左から右へ向かって桁が増加(または同じ)ため条件を満たしますが、332 のように「3 → 3 → 2」と減少が含まれる数は単調増加とはみなされません。 問題 今回求められているのは、数値 num を第一引数(かつ唯一の引数)として受け取るJavaScript関数を記述することです。 この関数は、num 以下の数の中から、単調増加する桁を持つ