实验6.1给定一个以字符串表示的非负整数num,移除这个数中的k位数字,使得剩下的数字最小。 注意: num 的长度小于10002且≥k。num不会包含任何前导零。 示例1: 输入:num = “1432219",k = 3输出: "1219" 解释:移除掉三个数字4,3,和2形成一个新的最小的数字1219。示例2∶ 输入:num = "10200", k = 1输出:“200" 解释:移掉首位的1剩下的数字为200.注意输出不能有任何前导零。c++代码
时间: 2023-06-20 15:04:21 浏览: 99
```c++
class Solution {
public:
string removeKdigits(string num, int k) {
stack<char> stk;
for (char c : num) {
while (!stk.empty() && k > 0 && stk.top() > c) {
stk.pop();
k--;
}
stk.push(c);
}
while (k > 0) {
stk.pop();
k--;
}
string ans = "";
while (!stk.empty()) {
ans += stk.top();
stk.pop();
}
reverse(ans.begin(), ans.end());
while (ans.size() > 1 && ans[0] == '0') {
ans.erase(0, 1);
}
return ans;
}
};
```
相关问题
实验6.1给定一个以字符串表示的非负整数num,移除这个数中的k位数 字,使得剩下的数字最小。 注意: num 的长度小于10002且≥k。num不会包含任何前导零。示例 1: 输入:num=“1432219",k=3 输出:“1219” 解释:移除掉三个数字4,3,和 2形成一个新的最小的数字1219。 示例2: 输入:num=“10200",k=1 输出:“200” 解释:移掉首位的 1剩下的数字为200.注意输出不能有任何前导零。写出c++代码
```c++
#include <iostream>
#include <stack>
#include <string>
using namespace std;
string removeKdigits(string num, int k) {
stack<char> stk;
int n = num.size();
for (int i = 0; i < n; i++) {
while (!stk.empty() && k > 0 && stk.top() > num[i]) {
stk.pop();
k--;
}
if (num[i] != '0' || !stk.empty()) stk.push(num[i]);
}
while (!stk.empty() && k > 0) {
stk.pop();
k--;
}
string res = "";
while (!stk.empty()) {
res += stk.top();
stk.pop();
}
reverse(res.begin(), res.end());
return res.empty() ? "0" : res;
}
int main() {
string num = "1432219";
int k = 3;
cout << removeKdigits(num, k) << endl;
return 0;
}
```
阅读全文