题目:
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
- num 的长度小于 10002 且 ≥ k。
- num 不会包含任何前导零。
示例:
思路分析:
总体思路就是在压入双向队列时,判断当前要入队的元素是否比队尾元素大,如果是,压入队尾,如果不是,移除队尾元素循环判断,直到K为0且队列不为空
class Solution {
public String removeKdigits(String num, int k) {
Deque<Character> deque = new LinkedList<Character>();
int length = num.length();
for (int i = 0; i < length; ++i) {
char digit = num.charAt(i);
while (!deque.isEmpty() && k > 0 && deque.peekLast() > digit) {
deque.pollLast();//去除双向队列里面最后一个数据
k--;
}
deque.offerLast(digit);//添加当前元素进队列末
}
for (int i = 0; i < k; ++i) {//当k不为0,队列已经是从前往右递增了
deque.pollLast();
}
StringBuilder ret = new StringBuilder();
boolean leadingZero = true;
while (!deque.isEmpty()) {
char digit = deque.pollFirst();
if (leadingZero && digit == '0') {
continue;
}
leadingZero = false;
ret.append(digit);
}
return ret.length() == 0 ? "0" : ret.toString();
}
}