402. 移掉K位数字

 方法一:

class Solution {
    public String removeKdigits(String num, int k) {
        int n = num.length();
        if(n <= k) return "0";
        StringBuilder sb = new StringBuilder(num);
        for(int i = 0; i < k; i++) {
            int idx = 0;                 // 找到第一个大于后面的字符删除它
            for(int j = 1; j < sb.length() && sb.charAt(j) >= sb.charAt(j-1); j++) idx = j;
            sb.delete(idx,idx+1);               // 去除前导0
            while(sb.length() > 1 && sb.charAt(0) == '0') sb.deleteCharAt(0);
        }
        return sb.toString();
    }
}

方法二:单调栈

class Solution {
    public String removeKdigits(String num, int k) {
        int n = num.length();
        if(n <= k) return "0";
        Stack<Integer> stack = new Stack<>();
        for(int i = 0; i < n; i++) {
            int m = num.charAt(i) - '0';
            while(k > 0 && !stack.empty() && stack.peek() > m) {
                k--;            // 记录每一个之前大于当前元素的值,删除它
                stack.pop();
            }
            stack.push(m);
        }
        while(k-- > 0) {
            stack.pop();
        }
        StringBuilder sb = new StringBuilder();
        while(!stack.empty()) {
            sb.append(stack.pop());
        }
        while(sb.length() > 1 && sb.charAt(sb.length()-1) == '0') {
            sb.deleteCharAt(sb.length()-1);
        }
        return sb.reverse().toString();
    }
}
原文地址:https://www.cnblogs.com/yonezu/p/13297494.html