给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
num 的长度小于 10002 且 ≥ k。 num 不会包含任何前导零。 示例 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。
var removeKdigits = function(num, k) {
const stack = []
const remain = num.length - k
for (let i = 0; i < num.length; i++) {
while(k > 0 && stack.length && stack[stack.length - 1] > num[i]) {
stack.pop()
k--
}
if (num[i] !== '0' || stack.length > 0) {
stack.push(num[i])
}
}
return stack.slice(0, remain).length === 0 ? '0' : stack.slice(0, remain).join('')
};
解题思路: 本题用栈解答,当要入栈的元素比栈顶元素小时,弹出栈顶元素,k--,注意一些刁钻的corner case即可,例如0,以及循环一次后k依旧大于0如何处理。