給定一個以字符串表示的非負整數?num,移除這個數中的 k 位數字,使得剩下的數字最小。
注意:
num 的長度小于 10002 且?≥ k。
num 不會包含任何前導零。
示例 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。
思路:遇到右邊相鄰數字比本身小,就刪除。比如13531,刪5是最佳選擇。如果不刪,接下來的數字不論怎么操作,都會是135****,都會大于133****。
如果遇到右邊相鄰比本身大不該刪除,因為會使數字更大。
對操作一次的新答案重復以上過程即可。
注意:可能到最后都沒有刪掉k個數,這時序列已經是一個非遞減序列,應該刪除后面對應個數的數字。
class Solution {public String removeKdigits(String num, int k) {LinkedList<Character> stack = new LinkedList<Character>();for(char digit : num.toCharArray()) {while(stack.size() > 0 && k > 0 && stack.peekLast() > digit) {stack.removeLast();k -= 1;}stack.addLast(digit);}for(int i=0; i<k; ++i) {stack.removeLast();}StringBuilder ret = new StringBuilder();boolean leadingZero = true;for(char digit: stack) {if(leadingZero && digit == '0') continue;leadingZero = false;ret.append(digit);}if (ret.length() == 0) return "0";return ret.toString();}
}
?