移除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

更新于:2021年3月18日

246 次浏览

开启您的 职业生涯

完成课程获得认证

开始学习
广告