AcWing 1453 移掉 k 位数字
题目
给定一个以字符串表示的非负整数num
,移除这个数中的k
位数字,使得剩下的数字最小
注意:
- 空字符串被视为
0
- 如果结果中包含前导零,则需要将前导零删除,最后删除的前导零不用包含在移除的
k
个数字中
输入格式
第一行输入一个字符串,用来表示非负整数num
第二行输入一个整数,表示k
输出格式
输出一个字符串,表示移除k
位数字后所能得到的最小数字
数据范围
0≤k≤
字符串长度≤100000
num
中不包含任何前导0
输入样例1:
1 | 1432219 |
输出样例1:
1 | 1219 |
样例1解释
移除掉三个数字4,3,2
可形成一个新的最小的数字1219
输入样例2:
1 | 10200 |
输出样例2:
1 | 200 |
样例2解释:
移掉首位的1
剩下的数字为200
,注意输出不能有任何前导零
输入样例3:
1 | 10 |
输出样例3:
1 | 0 |
样例3解释
从原数字移除所有的数字,剩余为空就是0
思路
这道题怎么解呢,首先我们考虑一种特殊情况,当原字符串中的每一位都是按字典序排列时,越小的数字排的越靠前,所以要是想移除k
位得到最小数字,只需要移除最后k
位即可
由此我们可以得到一个思路:将原字符串排序,移除后k
位来获得最小数字,但是这里我们不考虑这种方法,接下来介绍另一种方法
有序的情况我们分析了,那无序的呢?假设字符串是1, 5, 3, 2, 1
,我们要想移除2
位来获得最小数字呢?
我们先正常遍历字符串,当遇到nums[i] > nums[i + 1]
的情况时,为了能使最后得到的数字最小,我们一定要移除排名更前且值更大的数字,因为从数字的角度看,越大且排名越前的数字对整个数字的大小影响越大,比如190
一定大于109
还有一个问题就是前导零的问题,我们当得到了最后的结果之后,从头遍历一下数组,用i
记住前面有几个0
最后返回时从i
开始输出就好啦,下面是代码:
代码
1 |
|