题目:
分析:我们要得到删除后最小的数字,比较数字大小问题在实际生活中也会遇到,都是从高位开始比较,谁大则那个数字大,高位相等,往后推一位,以此类推。那么这个问题就好解决了,如果遇到左边的数字比我大,我就把它去掉。用一个栈能很好地解决这个问题,这里用到两层循环,外循环逐位遍历字符串num的字符,内循环判断栈顶与当前字符大小关系,若栈顶比当前大则删除栈顶,继续内循环,否则退出内循环并把字符添加到栈顶。
两次循环结束后还要判断特殊情况,如果字符串num是递增的,那么两次循环没有删除一个字符,这时候就从末尾删除k位即可;如果删除个数不慢k个,也从末尾删除剩余个数即可。
最终如果栈为空,即全部删除了,返回字符串0,否则拼接成字符串返回
代码:
class Solution {
public String removeKdigits(String num, int k) {
if(num.length() == k){
return "0";
}
Stack<Character> stack = new Stack<>();
for(int i = 0; i < num.length(); i++){
while(!stack.empty() && k > 0){
//当前字符比栈顶小才删除栈顶并继续循环
if(stack.peek() > num.charAt(i)){
stack.pop();
k--;
}else{
break;
}
}
//把当前字符加入到栈顶
stack.push(num.charAt(i));
}
//可能删除不够k个,则从末尾删除即可
for(int i = 1; i <= k; i++){
stack.pop();
}
StringBuilder result = new StringBuilder();
boolean firstZero = true;
for(char c : stack){
//只有第一个是0才会跳过
if(firstZero && c == '0'){
continue;
}
firstZero = false;
result.append(c);
}
if(result.length() == 0){
return "0";
}else{
return result.toString();
}
}
}