402. 移掉 K 位数字

159 阅读1分钟

题目

image.png

方法:栈

  • 若要使得剩下的数字最小,需要保证靠前的数字尽可能小。

image.png

IMG_11434C180C11-1.jpeg

class Solution {
    public String removeKdigits(String num, int k) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < num.length(); i++) {
            while (!stack.isEmpty() && k > 0 && stack.peek() - '0' > num.charAt(i) - '0') {
                stack.pop();
                k--;
            }
            stack.push(num.charAt(i));
        }
        // 没弹够k个,继续弹,由于右边的数更大,可以直接谈
        for (int i = 0; i < k; i++) {
            stack.pop();
        }
        //逆序的
        StringBuffer sb = new StringBuffer();
        while (!stack.isEmpty()) {
            sb.append(stack.pop());
        }
        // 反转为正序的
        StringBuffer rev = sb.reverse();
        StringBuffer res = new StringBuffer();
        for (int i = 0; i < rev.length(); i++) {
            // 去除前导零,注意0000的情况要返回“0”
            if (res.length() == 0 && rev.charAt(i) == '0' && i != rev.length() - 1) {
                continue;
            }
            res.append(rev.charAt(i));
        }
        // "1" k=1的情况 
        return rev.toString().equals("") ? "0" : res.toString();
    }
}