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」という最も小さい数を作ることができます。
コード例
この問題は、スタックを使った貪欲法(グリーディーアルゴリズム)で効率的に解くことができます。実装例は以下のとおりです。
const m = '45456757';
const n = 3;
const removeDigits = (m, n, stack = []) => {
let arr = m.split('').map(Number);
for(let el of arr){
while (n && stack.length && el < stack[stack.length - 1]){
stack.pop();
--n;
};
stack.push(el);
};
let begin = stack.findIndex(el => el > 0);
let end = stack.length - n;
return (!stack.length || begin == -1 || begin == end) ? "0" : stack.slice(begin, end).join('').toString();
};
console.log(removeDigits(m, n));コードの解説
ここでは、スタックを用いた貪欲法によって答えを構築しています。入力文字列 m の各桁 el を左から右へ順に走査し、スタックの先頭にある el より大きい値を最大 n 個まで取り除いたうえで、el をスタックにプッシュしていきます。
数値において左側の桁ほど重要度が高いため、この貪欲なアプローチにより、左側の桁には常にできるだけ小さい数字が配置されるようになります。その結果、スタックに残った大きな数字は右側の桁に集まることになります。
入力文字列 m の走査が終わった時点で、まだ削除すべき n 桁が残っている場合は、末尾から残り分を削除します。これは、右端の桁が比較的大きい数字になっているためです。
また、先頭のゼロを除去する処理や、すべての桁が削除された場合に「0」を返すフォールバック処理も組み込まれており、実用的なケースにも対応できます。
実行結果
コンソールには次のように出力されます。
44557
-
JavaScriptで数値の各桁の数字を一つずつ分割表示する方法
はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html> <head> &n
-
JavaScriptで数値の階乗の桁数を求める方法
問題JavaScriptで、数値 num を唯一の引数として受け取る関数を作成することを考えます。この関数は、num の階乗(n!)が何桁になるかを計算し、その桁数を返す必要があります。たとえば、関数への入力が次のような場合を考えてみましょう。入力const num = 7;出力const output = 4;出力の解説7! = 5040 であり、5040は4桁の数字であるため、結果は 4 となります。アプローチ:対数を使った賢い計算方法一見すると、階乗を直接計算して文字列の長さを数えればよさそうに思えます。しかし、階乗は極めて急激に増加するため、少し大きな数でもすぐにJavaScriptの