删数问题(C/C++)

在这里插入图片描述

AC代码:

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;


int main()
{
	string s;
	int i,j,k;
	cin >> s >> k ;
	
	if(k==0)
	{
		cout << s << endl ;
		return 0;
	}
	
	int next=0;
	for(i=0;i<k;i++)
	{
		for(j=0;j<s.size();j++)
		{
			if(j==s.size()-1){//找到了最后一个数还没有找完,证明已经都是升序排列了,直接标记最后一位 
				s[j]='x';
				//cout << "1" << endl ; 
				break;
				
			}
			while(next<=j||s[next]=='x')
			{
				//cout << next << " " << j << endl ;
				next++;//不能找已经被标记的
			}
			
			if(s[j]!='x'&&s[j]>s[next])//如果发现降序,则标记
			{
				s[j]='x';
				//cout << "2" << endl ;
				break;
			}
		}
		next=0;
	}
	
	int f=1; 
	for(i=0;i<s.size();i++)
	{
		if(s[i]=='0'&&f)continue;//如果是无效0就跳过 
		if(s[i]!='x')
		{
			cout << s[i] ;
			f=0; 
		}
	}
	if(f)cout << "0" << endl ;//到最后也没有一个有效数字输出,即为输出0的情况 
    
    return 0;
}

PS:防止以后自己看不懂,写在这里
关于代码有一点困扰了我很久,就是当数字全部是升序排列之后,表面上看是没办法再进行标记的,思考再三之后发现,因为是用的字符串类型的变量,全部升序并且没标记完时,会把最后一位标记为x,按照ASCII码来说,数字是排在字母前面的,所以当数字全部升序之后,会先进入一次第一种情况,然后会进入第二种情况。

下面是我用

123456
3

进行调试的结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值