洛谷P1098字符串的展开

该程序读取输入参数,遍历字符串,处理连续的数字或字母间的-。如果差值为1,则删除-;否则,根据参数p1(小写、大写或*填充)、p2(重复次数)和p3(正序或倒序展开)进行相应操作。

1.输入

2.遍历字符串,找到“-”

3.判断是否需要展开

~左右同为数字,或者同为数字

~如果s[i+1]-s[i-1]==1,去掉“-”

剩下的所有情况,都保留“-”

4.展开的规则

~如果p3是1,顺序展开

~如果p3是2,倒序展开

如果p1是1,小写填充,如果是2,大写填充,如果是3,“*”填充

每个字符输出p2次

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll; 
int p1,p2,p3;
string s; 
bool judge(char a,char b){//判定a和b是否同为数字/字母 
    if(isdigit(a)&&isdigit(b))return true;
    else if(isalpha(a)&&isalpha(b))return true;
    return false;
}
void exp(char a,char b){
    if(p3==1){
        for(char i=a+1;i<b;i++){
            for(int j=0;j<p2;j++){
                if(p1==1){
                    printf("%c",tolower(i));
                }
                else if(p1==2){
                    printf("%c",toupper(i));
                }
                else cout<<"*";
            }
        }
    }
    else {
        for(char i=b-1;i>a;i--){
            for(int j=0;j<p2;j++){
                if(p1==1){
                    printf("%c",tolower(i));
                }
                else if(p1==2){
                    printf("%c",toupper(i));
                }
                else cout<<"*";
            }
        }
    }
}
int main(){
    cin>>p1>>p2>>p3>>s;
    for(int i=0;i<s.size();i++){
        if(s[i]=='-'){
            if(s[i+1]-s[i-1]==1)continue;
            else if(s[i+1]<=s[i-1]){
                cout<<s[i];
                continue;
            }
            else if(judge(s[i-1],s[i+1])){
                exp(s[i-1],s[i+1]);
                continue;
            }
        }
        cout<<s[i];
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值