给定一个以字符串表示的非负整数 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。
import java.util.*;
//遇到比当前数小的就删掉末尾
public class Main {
static Scanner cin = new Scanner(System.in);
public static void main(String[] args) {
char[] ch = cin.next().toCharArray();
int k = cin.nextInt();
StringBuilder res = new StringBuilder();
res.append("0");
for (int i = 0; i < ch.length; ++i) {
int len = res.length();
while (k > 0 && ch[i] < res.charAt(len - 1)) { //往前找第一个不大于ch的数字位置
len --;
k--;
}
if (len < res.length()) res.delete(len, res.length());
res.append(ch[i]);
}
//没用完k
if (k > 0) res.delete(res.length() - k, res.length());
int i = 0;
while (i < res.length() && res.charAt(i) == '0') i++;
if (i > 0) res.delete(0, i);
System.out.println(res.length() == 0 ? "0" : res.toString());
}
}