题目描述
给一个正整数NUM1,计算出新正整数NUM2,NUM2为NUM1中移除N位数字后的结果,需要使得NUM2的值最小。
输入描述
1.输入的第一行为一个[字符串],字符串由0-9字符组成,记录正整数NUM1,NUM1长度小于32。
2.输入的第二行为需要移除的数字的个数,小于NUM1长度。
输出描述
输出一个数字字符串,记录最小值NUM2。
用例
输入
2615371
4
输出
131
解题思路
维护一个单调递增的栈来实现移除数字
- 初始化一个空栈
stack
,用于存储需要保留的数字。 - 遍历输入的正整数 NUM1 中的每个字符。
- 对于当前字符,检查栈顶元素是否大于当前字符,如果是,则出栈并减少需要移除的数字个数。这样可以确保移除的数字使得新正整数 NUM2 的值最小。
- 将当前字符入栈。
- 遍历完成后,如果仍有需要移除的数字个数,从栈顶开始移除剩余的数字。
- 将栈中的字符连接成一个字符串,去除前导零,输出结果。如果结果为空,则输出 "0"。
#include <iostream>
#include <vector>
#include <string>
std::string removeKdigits(std::string num, int k) {
std::vector<char>st;
for (int i = 0; i < num.size(); i++)
{
while (!st.empty() && k > 0 && st.back() > num[i])
{
st.pop_back();
--k;
}
st.push_back(num[i]);
}
while (k != 0 && !st.empty())
{
st.pop_back();
k--;
}
std::string ans = "";
bool isLeadingZero = true;
for (auto& digit : st) {
if (isLeadingZero && digit == '0') {
continue;
}
isLeadingZero = false;
ans += digit;
}
return ans == "" ? "0" : ans;
}
int main()
{
std::string str;
std::cin >> str;
int n;
std::cin >> n;
std::cout << removeKdigits(str, n);
return 0;
}