算法列表

402.移掉k位数字 中等

布莱克2026-03-20 11:01

问题:

给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。

示例 1 :

输入:num = "1432219", k = 3
输出:"1219"
解释:移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。

示例 2 :

输入:num = "10200", k = 1
输出:"200"
解释:移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。

示例 3 :

输入:num = "10", k = 2
输出:"0"
解释:从原数字移除所有的数字,剩余为空就是 0 。

回答:

思路:

1.维护一个单调栈,遍历字符串,如果栈中有数据,并且栈顶的数字大于当前数字,而且k > 0(待删除的数字数量大于0),弹出栈顶的数字,把新的数字推入栈

2.遍历完字符串后,如果k值还大于0,此时后面的数字比前面的数字大,从栈顶弹出相应数量的数字

3.去除前导零,如果最终栈位空直接返回'0'

var removeKdigits = function(num, k) {
    let stack = [];
    for (let val of num) {
        while (stack.length && stack[stack.length - 1] > val && k > 0) {
            stack.pop();
            k--;
        }
        stack.push(val);
    }
    //如果k>0,从栈顶删除元素,从前面删除会使较大值靠前,结果更大
    while (k > 0) {
        stack.pop();
        k--;
    }
    //删除前导零
    while (stack.length > 0 && stack[0] == '0') {
        stack.shift();
    }
    return stack.length == 0 ? '0' : stack.join('')
};


assistant