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

JavaScriptで1桁の移動(シャッフル)により作れる最小の数を求める方法

この記事では、JavaScriptを使って「数値の1桁を最大1回だけ移動して作れる最小の数」を求める問題の解き方を解説します。

問題の概要

正の整数nを引数として受け取るJavaScript関数を作成します。関数内では、次の操作を最大1回だけ実行できます。

  • 数値の中から任意の桁(インデックス)を1つ選択する
  • 選択した桁を一度取り除き、同じ位置または別の位置に挿入し直す

この操作によって得られる最小の数を求め、その値を関数の戻り値として返します。

サンプルコード

以下が実際のコードです。

const num = 354166;
const smallestShuffle = (num) => {
    const arr = String(num).split('');
    const { ind } = arr.reduce((acc, val, index) => {
        let { value, ind } = acc;
        if(value > val){
            value = val;
            ind = index;
        };
        return { value, ind };
    }, { value: Infinity, ind: -1 });
    const [item] = arr.splice(ind, 1);
    arr.unshift(item);
    return Number(arr.join(''));
};
console.log(smallestShuffle(num));

出力結果

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

135466

コードの解説

処理の流れを順番に確認していきましょう。

  1. 数値を桁ごとの配列に変換:String(num).split('')で数値を文字列化し、1文字ずつ配列要素に分割します。
  2. 最小の桁を検索:reduce()を使い、配列内で最も小さい数字とそのインデックスを取得します。探索の初期値は{ value: Infinity, ind: -1 }です。
  3. 該当の桁を削除:splice(ind, 1)で最小の数字を配列から取り除きます。
  4. 先頭へ移動:unshift(item)で取り除いた数字を配列の先頭に挿入します。
  5. 数値に戻して返却:join('')で連結した後、Number()で数値に変換して返します。

なお、比較には不等号>を使用しているため、同じ最小値の数字が複数存在する場合は最初(左端)に出現したものが選ばれる点に留意してください。

  1. JavaScriptでn桁を削除して作れる最小の数を求める方法

    問題JavaScriptで、2つの引数を受け取る関数を書くことを考えます。第1引数を m、第2引数を n とします。この関数の役割は、数値 m から n 桁を削除し、残った数字が表す数が最も小さくなるようにすることです。そして最後に、桁を削除した後の m を返します。たとえば、次のような入力が与えられた場合を考えます。const m = 45456757; const n = 3;このとき、期待される出力は次のとおりです。const output = 44557;出力の説明「45456757」から「5」「6」「7」という3つの数字を取り除くことで、「44557」という最も小さい数を作ることがで

  2. C++で0からnまでの整数に含まれる「1」の出現回数を効率的に数える方法

    問題概要 非負整数 n が与えられたとき、0 以上 n 以下のすべての整数に登場する数字「1」の合計出現回数を求める問題です。 たとえば入力が 15 の場合を考えてみましょう。「1」を含む数は [1, 10, 11, 12, 13, 14, 15] であり、これらに含まれる「1」は合計 8 個 です(11 には「1」が2個含まれる点に注意してください)。したがって出力は 8 となります。 解法のアプローチ すべての数を1つずつ調べる方法では計算量が膨大になるため、ここでは桁ごとに「1」の出現回数を数える効率的な手法を採用します。1の位・10の位・100の位…と各桁の位置について、その桁に「1