参考自:我要出去乱说 https://www.acwing.com/solution/content/33409/
思路与代码
这个大佬采用了很有趣的方式来获得最小情况,通过转移到另一个字符串,在途中去掉大的数字,然后处理前导0,获得了题目所需的最小值
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
string num;
int k;
cin >> num >> k;
string res = "0";
if(k >= num.size()) //如果要删除的数比字符串还长,则输出0
{
puts("0");
return 0;
}
for (int i = 0; i < num.size(); i ++ )//一个个数插入到res中,如果现插入数比res的尾数小,删除尾数再插入
{
while (k && num[i] < res.back())
{
res.pop_back();
k -- ;
}
res += num[i];
}
while(k--) res.pop_back(); //如果在循环内没有消耗完k,则获得的res一定是有序的,这时候删除后k(剩余的k)位,就可以得到带有前导0的最小数
int i = 0;
while (i < res.size() && res[i] == '0') i ++ ; //去掉前导0
if (i == num.size()) puts("0");//判断输出情况
else cout << res.substr(i) << endl;
return 0;
}