给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
示例 1 :
输入:num = “1432219”, k = 3
输出:“1219”
解释:移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。
思路:
从左至右扫描,当前扫描的数还不确定要不要删,入栈暂存。
123531
这样「高位递增」的数,肯定不会想删高位,会尽量删低位。
432135
这样「高位递减」的数,会想干掉高位,直接让高位变小,效果好。
所以,如果当前遍历的数比栈顶大,符合递增,是满意的,让它入栈。
如果当前遍历的数比栈顶小,栈顶立刻出栈,不管后面有没有更大的,为什么?
因为栈顶的数属于高位,删掉它,小的顶上,高位变小,效果好于低位变小。
let num = "100", k = 2
var removeKdigits2 = function (num, k) {
let stack = []
for (let i = 0; i < num.length; i++) {
let cur = num[i]
while (stack[stack.length - 1] > cur && k) {
stack.pop()
k--
}
stack.push(cur)
}
let flag = 0
for (let i = 0; i < stack.length; i++) {
if (stack[i] != 0) {
flag = i
break
}
}
stack.splice(0, flag)
if (k) {
while (k) {
stack.pop()
k--
}
}
const sum = stack.length && stack.reduce((acc, cur) => acc * 1 + cur * 1)
if (sum === 0) {
stack = [0]
}
return stack.length == 0 ? "0" : stack.join('');
};
console.log(removeKdigits2(num, k));