简单的最小数C++实现

一、题目描述

在这里插入图片描述

二、解题思路

该问题的一个简单解题思路,就是从左到右依次判断每一位数,若该位上的数字比后一位的数字大,则删掉该位置上的数字,然后回到开头继续执行判断操作,等到删够 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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_46027243/article/details/109812845