AcWing 1453. 移掉K位数字
宋标 Lv5

题目

给定一个以字符串表示的非负整数 ,移除这个数中的 位数字,使得剩下的数字最小。

注意:

  • 空字符串被视为0。
  • 如果结果中包含前导零,则需要将前导零删除,最后删除的前导零不用包含在移除的 个数字中。

输入格式

第一行输入一个字符串,用来表示非负整数

第二行输入一个整数,表示

输出格式

输出一个字符串,表示移除 位数字后所能得到的最小数字。

数据范围

字符串长度
中不包含任何前导

输入样例1:

1432219
3

输出样例1:

1219

样例1解释

移除掉三个数字 可形成一个新的最小的数字

输入样例2:

10200
1

输出样例2:

200

样例2解释:

移掉首位的 剩下的数字为 . 注意输出不能有任何前导零

输入样例3:

10
2

输出样例3:

0

样例3解释

从原数字移除所有的数字,剩余为空就是

题解

每次看了大佬的代码我就觉得我是个麻瓜…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>

using namespace std;

int main()
{
string s, res;
int k;
cin >> s >> k;

res = "0";
for (int i = 0; i < s.size(); ++ i)
{
//单调递增,最小的数值
while(k && s[i] < res.back())
{
-- k;
res.pop_back();
}
res += s[i];
}

//单调递增移除剩余后缀
while (k --) res.pop_back();

//去除前导0
int i = 0;
while (i < res.size() && res[i] == '0') ++ i;

if (i == res.size()) puts("0");
else cout << res.substr(i) << endl;

return 0;
}
 评论