一、题目描述
二、解题思路
该问题的一个简单解题思路,就是从左到右依次判断每一位数,若该位上的数字比后一位的数字大,则删掉该位置上的数字,然后回到开头继续执行判断操作,等到删够 k 位后,处理一下开头可能会有的 0 ,便可得到结果。如果没有数字比它的后一位大,即无法通过比较大小来删除,且已删除的位数不足 k,则从后往前依次删除,直到删够 k 位,处理一下开头可能会有的 0 ,便可得到结果。
举例如下:
n = 5, k = 3;
a = 21053;
第一次判断:2 比 1 大,删掉 2,得 1053 ,从头继续。
第二次判断:1 比 0 大,删掉 1 ,得 053, 从头继续。
第三次判断: 5 比 3 大,删掉 5,得 03。
已经删够 k 位, 得到结果为 3。
n = 6, k = 4;
a = 103289;
第一次判断:1 比 0 大,删掉 1,得 03289,从头继续。
第二次判断:3 比 2 大,删掉 3,得 0289,从头继续。
第三次判断:没有数字比它的后一位大,但没有删够 k 位,所以从后往前,删掉 9 和 8 ,得到结果为 02, 输出为 2。
三、代码实现
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n, k = 0;
vector<char> vec;
string s = "";
while(cin>>n>>k)
{
cin >> s;
vec.resize(s.size());
for(int i=0; i<s.size(); ++i)
{
vec[i] = s[i];
}
for(int i=0; i<vec.size()&&k>0; ++i) //判断数字大小,如果某个数字比它得后一位大,则删掉这个数字
{
if(vec[i]>vec[i+1])
{
vec.erase(vec.begin()+i,vec.begin()+i+1);
k--;
i=-1; //删掉较大数后从头继续
}
}
while(k--) //如果循环操作没有删够 k 位,则从后往前删够 k 位
{
vec.erase(vec.end()-1,vec.end());
}
while(vec[0]=='0'&&vec.size()!=0) //处理开头的 0
{
vec.erase(vec.begin(),vec.begin()+1);
}
if(vec.size()==0) //如果数位全部被删掉了,则输出 0
{
cout << 0;
}
else
{
for(int i=0; i<vec.size(); ++i)
{
cout << vec[i];
}
}
cout << endl;
}
}