# 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(); } } ```