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

JavaScriptで同じ数字から作れる「次に大きい数」を見つける方法


問題

数値 n を引数として受け取るJavaScript関数を作成することを考えます。この関数は、入力された数値とまったく同じ数字の組み合わせを使いながら、入力値よりわずかに大きい数のうち最小のものを返す必要があります。

例えば、入力が 112 の場合、出力は 121 となります。これは、112 の数字(1、1、2)を並べ替えて作れる数のうち、112 より大きい最小の数だからです。

解決策のコード例

以下がその実装コードです。

const num = 112;
const findNextBigger = (num = 1) => {
    const sortedDigits = (num = 1) => {
        return String(num)
        .split('')
        .sort((a, b) => b - a);
    };
    let max = sortedDigits(num).join('');
    max = Number(max);
    for(let i = num + 1; i <= max; i++){
        if(max === +sortedDigits(i).join('')){
            return i;
        };
    };
    return -1;
};
console.log(findNextBigger(num));

コードの仕組み

このアルゴリズムは、次のステップで動作します。

  • 最大値の算出: 内部関数 sortedDigits は、数値を文字列化して各桁に分割し、降順(b - a)に並べ替えます。桁を降順に並べた数が、同じ数字で作れる最大の数になります。
  • 探索範囲の設定: 探索の上限として、先ほど求めた最大値を使用します。これにより、無駄のない効率的なループが実現できます。
  • 線形探索: 入力値 + 1 から上限まで順番に各数値をチェックし、桁を降順に並べ替えた結果が最大値と一致する(=同じ数字の組み合わせである)最初の数値を返します。
  • 該当なしの場合: より大きい数が存在しない場合(例:すべて同じ桁の 111 など)は -1 を返します。

出力

上記コードを実行すると、コンソールには次のように出力されます。

121

このように、シンプルな降順ソートと線形探索を組み合わせることで、「同じ数字で構成される次に大きい数」を簡単に求めることができます。

  1. JavaScriptで数値が三角数かどうかを判定する方法

    三角数(Triangular Number)とは? 三角数とは、点を正三角形の形に敷き詰めたときに現れる数のことです。n番目の三角数は「1からnまでの自然数の合計」として表され、次の公式で求められます。 Tn = n(n+1) / 2 具体的な三角数は 1, 3, 6, 10, 15, 21, 28 … と続きます。例えば 10 は、各辺に4個の点を配置した正三角形を構成できるため、三角数です。 問題 数値を引数として受け取り、その数値が三角数であれば true を、そうでなければ false を返すJavaScript関数を実装します。 判定の考え方 n(n+1)/2 = num となる正

  2. JavaScriptで単調増加する桁を持つ、指定した数以下の最大の数を求める方法

    単調増加する桁(Monotonically Increasing Digits)とは 整数が「単調増加する桁」を持つとは、隣り合う任意の2つの桁 x と y の間に、常に x <= y が成り立つことを指します。たとえば 1234 や 2299 は左から右へ向かって桁が増加(または同じ)ため条件を満たしますが、332 のように「3 → 3 → 2」と減少が含まれる数は単調増加とはみなされません。 問題 今回求められているのは、数値 num を第一引数(かつ唯一の引数)として受け取るJavaScript関数を記述することです。 この関数は、num 以下の数の中から、単調増加する桁を持つ