/*
* 解题思路:若要使得剩下的数字最小,需要保证靠前的数字尽可能小【很关键】。
* 即:字符串中每个位置的数字与其前一位的数字相比较,如果大于或等于前一位数字,
* 则加入队列中;如果小于前一位数字的话,则将前面大于它的数字都弹出队列。
* 当弹出的数字个数为k时,此时队列中的数字组合起来就是题解。
* */
public String removeKdigits(String num, int k) {
int len = num.length();
//创建一个队列
Deque<Character> deque = new ArrayDeque<>();
for (int i = 0; i < len; i++) {
char c = num.charAt(i);
//当队列不为空 且 删除的个数小于k 且 队尾的元素大于当前元素时
while (!deque.isEmpty() && k > 0 && deque.peekLast() > c) {
deque.pollLast();
k--;
}
deque.addLast(c);
}
//当k值未减小到0时(即从字符串中移除的数字未达到k)。比如num=“1234567”
for (int i = 0; i < k; i++) {
deque.pollLast();
}
StringBuilder builder = new StringBuilder();
//定义一个标记,表示是否是前导零
boolean flag = true;
while (!deque.isEmpty()) {
char first = deque.pollFirst();
if (flag && first == '0') {
continue;
}
flag = false;
builder.append(first);
}
return builder.length() == 0 ? "0" : builder.toString();
}