NC16644字符串的展开【题解】【入门向】

63 阅读2分钟

题目来源【牛客竞赛】:

ac.nowcoder.com/acm/problem…

题解:

#include<bits/stdc++.h>
using namespace std;
 
//引入下面有用到的函数
bool isok(char a,char b);
string func(const string& p,int p1,int p2,int p3);
 
//喜欢简短主函数,给人清爽的感觉
int main(){
    int a,b,c;cin>>a>>b>>c;
    string s;
    //清楚缓冲区之后再进行读取一整行字符串,也可以把该行直接改成cin>>string
    cin.ignore();getline(cin,s);
    //func是一个主要功能实现的函数,把所有参数往里面塞
    string ans=func(s,a,b,c);
    cout<<ans;
    return 0;
}
//这是一个判断前后两数是否同为字母或同为数字的函数
bool isok(char a,char b){
    if(isdigit(a)&&isdigit(b)){
        return 1;
    }
    else if(isalpha(a)&&isalpha(b)){
        return 1;
    }
    return 0;
}
 
 
string func(const string& p,int p1,int p2,int p3){
    //r作为临时存储单个填充串
    string r="";
    //p引用了字符串,不要直接用带const的p,因此创建一个ans作为return的答案
    string ans=p;
    //遍历原字符串
    for(int i=0;i<ans.length();i++){
        //如果当前字符是'-'且前后类型相同,且后者比前者大
        if(ans[i]=='-'&&isok(ans[i-1],ans[i+1])&&ans[i-1]<ans[i+1]){
            //x临时存储原字符串中'-'左边字符
            char x=ans[i-1];
            //初始化r(r包括'-'左右的元素)
            r=r+x;x++;
            //如果当前元素不是'-'右边元素,进行操作
            while(x!=ans[i+1]){
                //变量k临时存储p2,作用还有用于while()的计数
                int k=p2;
                //三种情况不同处理,其中注意toupper()返回int值所以要转化为char
                if(p1==1){while(k--) r=r+x;x++;}
                if(p1==2){while(k--) r=r+char(toupper(x));x++;}
                if(p1==3){while(k--) r=r+'*';x++;}
            }
            //翻转函数,注意下标
            if(p3==2){reverse(r.begin()+1,r.end());}
            //将ans的'x-x'用r取代,
            //遍历变量i向前退一格,来到r的头部,以防出界,
            //并且清空临时存储r,
            ans.replace(i-1,2,r); i--;r="";
        }
    }
    return ans;
}

欢迎提问和交流