给你一个以字符串表示的非负整数
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 <= num.length <= 105
num
仅由若干位数字(0 - 9)组成- 除了 0 本身之外,
num
不含任何前导零
/**
* @param {string} num
* @param {number} k
* @return {string}
*/
var removeKdigits = function(num, k) {
let n = num.length;
if(n <= k || n === 1) return "0";
// 处理数字最前面是0的情况
const handleStr = (str) => {
let i = 0;
while(str[i] == 0) i++;
if(i == str.length) return "0";
return str.slice(i);
}
let stack = [];
let count = 0;
for(let i = 0; i < n;i++){
while(stack.length && stack[stack.length - 1] > num[i]){
stack.pop();
count++;
if(count === k){
// 将栈里面的元素和没有入栈的元素进行拼接最后处理返回
return handleStr(stack.join('') + num.slice(i));
}
}
stack.push(num[i]);
}
// num 是 12345678 ,count < k,直接从尾部截取
if(count < k) return handleStr(stack.join("").slice(0,count - k));
};