给定一个以字符串表示的非负整数 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。
思路:单调栈即可,当删除的元素个数 = k 时直接退出循环,若退出循环的时候个数 < k,则从末尾在删掉一些元素,直至它的个数 = k
代码:
class Solution {
public:
string removeKdigits(string num, int k) {
stack<char>sta;
while(!sta.empty()) sta.pop();
int cnt = 0;
for(int i = 0; i < num.size(); i++){
if (sta.empty()) sta.push(num[i]);
else {
while(!sta.empty() && sta.top() > num[i] && cnt < k){
sta.pop(); cnt++;
}
sta.push(num[i]);
}
};
while(cnt < k) {
sta.pop(); cnt++;
}
stack<char>mid;
while(!sta.empty()) {
char ch = sta.top(); sta.pop();
mid.push(ch);
}
string ans = "";
while(!mid.empty()) {
char ch = mid.top();
if (ch != '0') break;
else mid.pop();
}
while(!mid.empty()){
char ch = mid.top(); mid.pop();
ans += ch;
}
if (ans.size() == 0) ans += '0';
return ans;
}
};