# 402. Remove K Digits 移掉 K 位數字 [stack]【medium】
給你一個以字符串表示的非負整數 num 和一個整數 k ,移除這個數中的 k 位數字,使得剩下的數字最小。請你以字符串形式返回這個最小的數字。
示例 1 :
```
輸入:num = "1432219", k = 3
輸出:"1219"
解釋:移除掉三個數字 4, 3, 和 2 形成一個新的最小的數字 1219 。
```
示例 2 :
```
輸入:num = "10200", k = 1
輸出:"200"
解釋:移掉首位的 1 剩下的數字為 200. 注意輸出不能有任何前導零。
```
示例 3 :
```
輸入:num = "10", k = 2
輸出:"0"
解釋:從原數字移除所有的數字,剩余為空就是 0 。
```
題解思路:
num:1432219 k=3
1. 第一個數字先入棧 [1] ,k=2
3. 當前的數字跟前一個數字進行比較,若比前一個數字大,則入棧。 [1,4] , k=1
4. 當前的數字若比前一個數字小,則刪除前一個數字,將該數字出棧,當前數字進棧。不用考慮後面的數字。[1,3],k=1 ,4出棧,3進棧。
5. 因為刪除高位數,數字會對低位數有利。而當前數字若較小,前一個數字屬高位數,所以刪掉。
6. 若1001,k=5, 刪不完的話,從res的後面繼續刪。
```java=
class Solution {
public String removeKdigits(String num, int k) {
Stack<Character> res = new Stack<>();
StringBuilder sb = new StringBuilder();
for(char ch:num.toCharArray()){
while(k>0 && !res.isEmpty() && ch<res.peek()){
res.pop();
k--;
}
//處理前導0 ,若為0跳過
if(ch == '0' && res.size() == 0) continue;
res.push(ch);
}
while(k>0 && !res.isEmpty()){
res.pop();
k--;
}
if(res.isEmpty()) return "0";
for(char ch: res){
sb.append(ch);
}
return sb.length() == 0 ? "0" :sb.toString();
}
}
```