移掉K位数字
给定一个以字符串表示的非负整数 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
思路:
对于1a34和1b34,如果a>b,则1a34>1b34,所以从左往右遍历
对于3421,删掉4会使数字最小,因为4>2
利用单调栈,栈中元素递增,如果当前元素比栈顶小,则删除栈顶元素
public String removeKdigits(String num, int k) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < num.length(); i++) {
while (!stack.isEmpty() && stack.peek() > num.charAt(i) && k > 0) {
stack.pop();
k--;
}
stack.push(num.charAt(i));
}
while (k > 0) {//考虑没有删到k个或者当num递增的时候一个都没删到
stack.pop();
k--;
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
String ans = sb.reverse().toString();
int i = 0;
while (i < ans.length() && ans.charAt(i) == '0') {//考虑开头为0的情况
i++;
}
ans = ans.substring(i);
if (ans.isEmpty()) {
ans = "0";
}
return ans;
}