给定一个以字符串表示的非负整数 numnum,移除这个数中的 kk 位数字,使得剩下的数字最小。
注意:

  • 空字符串被视为0。
  • 如果结果中包含前导零,则需要将前导零删除,最后删除的前导零不用包含在移除的 kk 个数字中。

    输入格式

    第一行输入一个字符串,用来表示非负整数 numnum。
    第二行输入一个整数,表示 kk。

    输出格式

    输出一个字符串,表示移除 kk 位数字后所能得到的最小数字。

    数据范围

    0≤k≤0≤k≤ 字符串长度 ≤100000≤100000,
    numnum 中不包含任何前导 00。

    输入样例1:

    1432219 3

    输出样例1:

    1219

    样例1解释

    移除掉三个数字 4,3,24,3,2 可形成一个新的最小的数字 12191219。

    输入样例2:

    10200 1

    输出样例2:

    200

    样例2解释:

    移掉首位的 11 剩下的数字为 200200. 注意输出不能有任何前导零

    输入样例3:

    10 2

    输出样例3:

    0

    样例3解释

    从原数字移除所有的数字,剩余为空就是 00。

image.png


  1. import java.util.*;
  2. //遇到比当前数小的就删掉末尾
  3. public class Main {
  4. static Scanner cin = new Scanner(System.in);
  5. public static void main(String[] args) {
  6. char[] ch = cin.next().toCharArray();
  7. int k = cin.nextInt();
  8. StringBuilder res = new StringBuilder();
  9. res.append("0");
  10. for (int i = 0; i < ch.length; ++i) {
  11. int len = res.length();
  12. while (k > 0 && ch[i] < res.charAt(len - 1)) { //往前找第一个不大于ch的数字位置
  13. len --;
  14. k--;
  15. }
  16. if (len < res.length()) res.delete(len, res.length());
  17. res.append(ch[i]);
  18. }
  19. //没用完k
  20. if (k > 0) res.delete(res.length() - k, res.length());
  21. int i = 0;
  22. while (i < res.length() && res.charAt(i) == '0') i++;
  23. if (i > 0) res.delete(0, i);
  24. System.out.println(res.length() == 0 ? "0" : res.toString());
  25. }
  26. }