给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
示例 1 :
输入: num = “1432219”, k = 3
输出: “1219”
解释: 移除掉三个数字 4, 3, 和 2形成一个新的最小的数字 1219。
针对该问题,显然很好的解决办法便是贪心
从高位开始遍历整数,即在移除的数字在k的范围内,尽可能选择移除较小的数值
实现上使用栈的形态进行管理,栈保存最终的移除后的结果,并且动态变化;当出现元素小于栈顶元素的情况下将栈顶元素移除,在栈不为空或者 元素不等于零时 将该元素放入栈中。
实现如下:
string removeKdigits(string num, int k) {
vector<int> S;
string result = "";
for (int i = 0;i < num.length(); ++i) {
int number = num[i] - '0';
while(S.size() != 0 && S[S.size() - 1] > number && k) {
S.pop_back();
k--;
}
if (number != 0 || S.size()) {//处理前导零的情况
S.push_back(number);
}
}
while(S.size() && k) {
S.pop_back();
k--;
}
for (int i = 0;i < S.size(); ++i) {
result.append(1,'0' + S[i]);
}
if (result == "") {
return "0";
}
return result;
}