NC16644 字符串的展开

字符串的展开 (nowcoder.com)

题目解读

        简单模拟。

代码详注

#include<bits/stdc++.h>

#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define double long double

using namespace std;
#define debug 0
const int maxn=1e6+50;
const ll mod=1e9+7;
int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
inline ll read(){ll res=0,f=0;char ch=getchar();for(;!isdigit(ch);ch=getchar()) f=(ch=='-'?1:0);for(;isdigit(ch);ch=getchar()) res=(res<<3)+(res<<1)+(ch^'0');return f?-res:res;}

ll p1,p2,p3;

int check(char c1,char c2){//判断左右字符类型 
	if(c1>='a'&&c1<='z'&&c2>='a'&&c2<='z')
	{
		return 1;//小写 
	}
	else if(c1>='A'&&c1<='Z'&&c2>='A'&&c2<='Z')
	{
		return 2;//大写 
	}
	else if(c1>='0'&&c1<='9'&&c2>='0'&&c2<='9')
	{
		return 3;//数字 
	}
	return 0;//不符合 
}
void fun(char c1,char c2,int k){
	if(k==0||c2<=c1)//不符合或非升序输出 -
	{
		cout<<"-";
		return ;
	}
	if(c2==c1+1)//相邻升序输出 
	{
		return ; 
	}
	if(k==3)//数字 
	{
		char ch='0';
		if(p3==1)//升序 
		{
			for(char i=c1+1;i<c2;i++)
			{
				for(int j=0;j<p2;j++)
				{
					if(p1==3)
					{
						cout<<"*";//p1==3则输出*
					}
					else
					{
						cout<<i;
					}
				}
			}
		}
		else//降序 
		{
			for(char i=c2-1;i>c1;i--)
			{
				for(int j=0;j<p2;j++)
				{
					if(p1==3)
					{
						cout<<"*";//p1==3则输出*
					}
					else
					{
						cout<<i;
					}
				}
			}
		}
		return ;
	}
	char c;
	if(k==1)//读入小写字母 
	{
		c='a';
	}
	else//读入大写字母 
	{
		c='A';
	}
	char ch;
	if(p1==1)//输出小写字母 
	{
		ch='a';
	}
	else if(p1==2)//输出大写字母 
	{
		ch='A';
	}
	if(p3==1)//升序 
	{
		for(char i=c1+1;i<c2;i++)
		{
			for(int j=0;j<p2;j++)
			{
				if(p1==3)
				{
					cout<<"*";//p1==3则输出*
				}
				else
				{
					cout<<char(i-c+ch);
				}
			}
		}
	}
	else//降序 
	{
		for(char i=c2-1;i>c1;i--)
		{
			for(int j=0;j<p2;j++)
			{
				if(p1==3)
				{
					cout<<"*";//p1==3则输出*
				}
				else
				{
					cout<<char(i-c+ch); 
				}
			}
		}
	}
	return ;
}
void solve(){
	cin>>p1>>p2>>p3;
	string s;
	cin>>s;
	int len=s.length();
	for(int i=0;i<len;i++)
	{
		if(s[i]!='-')//正常输出 
		{
			cout<<s[i];
			continue;
		}
		if(i-1>=0&&i+1<len)//可走流程 
		{
			fun(s[i-1],s[i+1],check(s[i-1],s[i+1]));
		}
		else//输出- 
		{
			cout<<s[i];
		}
	}
	return ;
}

int main(){
//	freopen("plant2.in","r",stdin);
	if(!debug)
	{
		ios::sync_with_stdio(false);
		cin.tie(0);cout.tie(0);
	}
	
	solve();
	
	return 0;
}

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值