单调栈

import java.util.*;


public class Solution {
    public String removeKnums (String num, int k) {
      //定义一个单调栈用于求删除k位后能得到的最小的整数
      Stack<Integer> stack1=new Stack<>();
      int n=num.length();
      //遍历整个字符串的每一位
      //先将字符串的第i位的数字字符转化为数字,用charAt函数用来定位获得字符串的第i位
      for(int i=0;i<n;i++){
        int c=num.charAt(i)-'0';
        //栈1如果不为空,并且删除的数字的个数还没达到k个,并且栈顶的元素的值大于要入栈的元素,就表明可以用当前的元素来替换之前的元素,即将之前的元素进行删除,这样可以得到最大的数字
        while(!stack1.isEmpty()&&k>0&&stack1.peek()>c){
            stack1.pop();
            k--;
        }
        //将该元素进行入栈
        stack1.push(c);
      }
      //例如100999,则运行到这里的时候栈中的元素:00999
      //由于只删除了一个元素,所以继续进行删除
      while(!stack1.isEmpty()&&k>0){
        stack1.pop();
        k--;
      }
      //创建一个新的栈,用于辅助反转00999,让0在栈的上面,将前导0删除
      Stack<Integer> stack2=new Stack<>();
      while(!stack1.empty()){
        stack2.push(stack1.pop());
      }
      while(!stack2.empty()&&stack2.peek()==0){
        stack2.pop();
      }
      //用StringBuilder的无参构造函数创建一个字符串
      StringBuilder ans=new StringBuilder();
    //只要栈2不为空,就将对应的元素append加到字符串的后面

      while(!stack2.empty()){
        ans.append(stack2.pop());
      }
      //判断一下字符串ans的长度,如果长度为0,就返回“0”,否则就返回ans.toString()
      return ans.length()>0?ans.toString():"0";
    }
}