题解:
对于这题我们使用贪心思想
贪心策略是比较前一个数是不是比后面一位数要大(因为要得到最小的数,就要尽量让数的前面位数小)
如果要大的话,就把当前的数给删去
得到一个新的string
然后再重新进行一次两两大小的判断
每重新判断一次
就会删去一个数
也就是总体要判断k次
当然也会出现没有前面的数比后面的数要大的情况
此时这个string里面的数是呈现递增的现象的,那么就删除最后一个元素
另外:
要考虑三种特殊情况:
一种是:前导0要删去 列如:012
一种是:数中间的零不能删去 列如:102
一种是:全是0的一种情况 列如:000000
代码:
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
string N;
int k;
cin >> N >> k;
for (int j = 0; j < k; j++) {
int len = N.length();
int pos = 0;
int t = 0;
for (int i = 0; i < len - 1; i++) {
if (N[i] > N[i + 1]) {
pos = i;
t++;
break;
}
}
if (t == 0) {
pos = len - 1;
}
N.erase(pos, 1);
}
int len = N.length();
int bushiling=0;
for (int i = 0; i < len-1; i++) {
if (N[i] != '0') {
bushiling++;
cout << N[i];
}
else {
if (bushiling != 0) {
cout << N[i];
}
}
}
cout << N[len - 1];
return 0;
}