给你一个以字符串表示的非负整数 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('')
};