给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。


    示例 1 :

    输入:num = “1432219”, k = 3
    输出:”1219”
    解释:移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。
    示例 2 :

    输入:num = “10200”, k = 1
    输出:”200”
    解释:移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
    示例 3 :

    输入:num = “10”, k = 2
    输出:”0”
    解释:从原数字移除所有的数字,剩余为空就是 0 。

    提示:

    1 <= k <= num.length <= 105
    num 仅由若干位数字(0 - 9)组成
    除了 0 本身之外,num 不含任何前导零


    1. class Solution {
    2. public String removeKdigits(String num, int k) {
    3. char[] ch = num.toCharArray();
    4. int n = ch.length;
    5. StringBuilder res = new StringBuilder();
    6. res.append("0");
    7. for (int i = 0; i < n; ++i) {
    8. //往左边找到第一个不小于当前值
    9. int len = res.length();
    10. while (k > 0 && ch[i] < res.charAt(len - 1)) {
    11. k--;
    12. len--;
    13. }
    14. //如果满足则删除
    15. if (len < res.length()) res.delete(len, res.length());
    16. res.append(ch[i]);
    17. }
    18. //当k还没有用完的时候直接删后边的数字
    19. if (k > 0) res.delete(res.length() - k, res.length());
    20. int i = 0;
    21. //删除前导0
    22. while (i < res.length() && res.charAt(i) == '0') i++;
    23. res.delete(0, i);
    24. return res.length() == 0 ? "0" : res.toString();
    25. }
    26. }