移除n位数字后的最小数字(JavaScript)
问题
我们需要编写一个 JavaScript 函数,它接收两个数字作为参数,我们分别称它们为 m 和 n。
函数的任务是从数字 m 中移除 n 位数字,使得移除数字后的 m 是尽可能小的数字。最后,函数应该返回移除数字后的数字 m。
例如,如果函数的输入是:
const m = '45456757'; const n = 3;
那么输出应该是:
const output = '44557';
输出解释
我们移除了 5、6 和 7 位数字以得到尽可能小的数字。
示例
代码如下:
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));
代码解释
我们在这里使用了基于栈的贪婪算法来计算答案。对于输入字符串 num 中从左到右的每个值 el,在移除栈中最多 n 个大于 el 的值后,我们将 el 推入栈中。
由于数字的左端位置比右端位置更有价值,这种贪婪方法确保左端位置由最小数字组成,而栈中剩下的数字是右端位置的最大数字。
处理完输入字符串 m 后,如果还有剩余的 n 位数字需要移除,则移除最右边 n 位数字,因为最右边 n 位数字是最大的数字。
输出
控制台输出将是:
44557
广告