https://leetcode-cn.com/problems/remove-k-digits/
题目:给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
解析:使剩下的数字最小,可以这样想:数字位数固定,则高位的数越小,数值越小,因此要不断删掉高位的大数,使得剩下的数,从高位到低位,呈增序;
可以利用栈来实现,即在将num每个字符压入栈时,判断栈顶元素是否大于即将入栈元素,如大于,则删除栈顶元素,如小于,则压入栈顶元素;
利用栈来实现,最后输出的时候,需要翻转顺序;因此可以直接使用双端队列实现。
class Solution {
public String removeKdigits(String num, int k) {
//为了增删方便,利用双端队列
Deque<Character> queue = new LinkedList<Character>();
int len = num.length();
for(int i = 0; i < len; i++){
char digist = num.charAt(i);
while(!queue.isEmpty() && k>0 && queue.peekLast() > digist){
queue.pollLast();
k--;
}
queue.offerLast(digist);
}
//判断删掉的个数是否等于k,小于k的话,将队列后边较大的数删掉
for(int i = 0; i < k; i++){
queue.pollLast();
}
StringBuilder stringBuilder = new StringBuilder();
boolean leaderZero = true;
while(!queue.isEmpty()){
char head = queue.pollFirst();
//如果队首为0,则跳过
if(leaderZero && head == '0'){
continue;
}
//队首不为0,用false,方便上边的&&判断
leaderZero = false;
stringBuilder.append(head);
}
return stringBuilder.length() == 0 ? "0" : stringBuilder.toString();
}
}