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
コードの解説
処理の流れを順番に確認していきましょう。
- 数値を桁ごとの配列に変換:
String(num).split('')で数値を文字列化し、1文字ずつ配列要素に分割します。 - 最小の桁を検索:
reduce()を使い、配列内で最も小さい数字とそのインデックスを取得します。探索の初期値は{ value: Infinity, ind: -1 }です。 - 該当の桁を削除:
splice(ind, 1)で最小の数字を配列から取り除きます。 - 先頭へ移動:
unshift(item)で取り除いた数字を配列の先頭に挿入します。 - 数値に戻して返却:
join('')で連結した後、Number()で数値に変換して返します。
なお、比較には不等号>を使用しているため、同じ最小値の数字が複数存在する場合は最初(左端)に出現したものが選ばれる点に留意してください。
-
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」という最も小さい数を作ることがで
-
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