import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num string字符串 
     * @param k int整型 
     * @return string字符串
     */
    public String removeKnums (String num, int k) {
        if(k == num.length()){
            return "0";
        }
        int total = num.length() - k;
        Deque<Character> dq = new ArrayDeque<>();
        for (int i = 0; i < num.length(); i++) {
            while (!dq.isEmpty() && dq.peekLast() - num.charAt(i) > 0){//队列尾部元素大于当前遍历的字符,需要弹出
                if(dq.size() - 1 + num.length() - i >= total){//确保弹出后后续元素加入队列能达到目标长度
                    dq.removeLast();
                }else {
                    break;
                }
            }
            if(dq.size() < total){//队列元素少于目标长度时才能添加元素
                dq.addLast(num.charAt(i));
            }
        }
        StringBuffer sbr = new StringBuffer();
        boolean flag = false;
        while (!dq.isEmpty()){
            if(dq.peekFirst() != '0'){//去掉前导0的标志
                flag = true;
            }
            if(flag){
                sbr.append(dq.removeFirst());
            }else {
                dq.removeFirst();
            }
        }
        String res = new String(sbr);
        return res.equals("") ? "0" : res;
    }
}

单调栈,注意压栈和弹栈条件即可