给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
示例 1 :
输入: num = "1432219", k = 3
输出: "1219"
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。
解题思路:
使用模拟栈。
遍历num 当K>0 且栈不为空的时候 比较当前字符与栈顶字符
if 当前字符<栈顶字符 将原栈顶字符出栈 当前字符进栈
不满足上述情况直接入栈 (结果字符串最后长度应该num.length()-k)
结果可能存在001这种,去掉0
用一个index=0
当index< 结果长度 && index对应字符是0 index++;
最后的情况可能:
k=0了 此时得到的是已经可以组成最小数的字符串
k>0 此时只需要自栈底到num.length()-k的长度
最终结果:
当index==结果字符串最后长度应该num.length()-k 说明最后结果“0”
否则:最终结果是栈内对应的index-num.length()-k元素组成的字符串。
class Solution {
public String removeKdigits(String num, int k) {
if(num.length()==0||num.length()<=k)
return "0";
char strStack[]=new char[num.length()];
int newLength=num.length()-k;
int top=0;
for(int i=0;i<num.length();i++){
char c=num.charAt(i);
while(top>0&&strStack[top-1]>c&&k>0){
top--;
k--;
}
strStack[top++]=c;
}
int index=0;
while(index<newLength&&strStack[index]=='0')
index++;
return index==newLength?"0":new String(strStack,index,newLength-index);
}
}