题目链接:字符串的展开
这道题挺简单的,但是就是一些细节需要慢慢考虑,不断完善条件才能AC。
比如注释中的1 2 3 4点都是我一开始没有考虑到的(还是下载了两个点才发现错误所在),题目也要仔细看!!太粗心了。
看大佬的题解,发现可以利用几个字符的函数。
#include<cctype
1、isalpha(x) 判断x是否为字母
2、isdigit(x) 判断x是否为数字
3、islower(x) 判断x是否为小写字母
4、isupper(x) 判断x是否为大写字母
5、isalnum(x) 判断x是否为字母或数字
6、ispunct(x) 判断x是否为标点符号
7、isspace(x) 判断x是否为空格
对于以上函数,如果x符合条件的话,均会返回true,否则返回false
还有以下函数:
1、toupper(x) 如果x是小写字母,将其转换成大写字母
2、tolower(x) 如果x是大写字母,将其转换成小写字母
====================================================
#include<string
1、s.erase(x,y) 表示将字符串s从x位置起删除y个字符
2、s.insert(x,y) 表示将字符串y(或字符y)插入到s的x位置处
3、s.push_back(x) 表示在s的末尾插入字符x
4、reverse(s.begin(),s.end()) 将字符串s翻转
#include<iostream>
using namespace std;
string s,s1;
int main(void)
{
int p1,p2,p3;
int len;
cin>>p1>>p2>>p3;
cin>>s;
len=s.length();
for(int i=0;i<len;i++){
if(s[i]!='-') cout<<s[i];
else if(s[i+1]<=s[i-1]||s[i+1]-s[i-1]>=40||i==0||s[i-1]=='-') cout<<"-";
//1.后一个字符小于等于前一个字符
//2.一个为字母一个为数字
//3.i==0 s[i]=='-'
//4.连续两个字符都是'-'
else {//同为数字or同为字母
if(s[i-1]==s[i+1]){//c-c
cout<<"-";
continue;
}
else if(s[i-1]+1==s[i+1]){//c-d
cout<<s[i+1];
i++;
continue;
}
else{//c-f
int j=s[i+1]-s[i-1]-1;
int k=0;
if(p1==1){
while(j--){
for(int q=0;q<p2;q++){
s1[k++] = s[i-1]+j+1;
}
}
}
else if(p1==2){
while(j--){
if(s[i-1]>='a'&&s[i-1]<='z'){
for(int q=0;q<p2;q++){
s1[k++] = s[i-1]-'a'+'A'+j+1;
}
}
else{//number
for(int q=0;q<p2;q++){
s1[k++] = s[i-1]+j+1;
}
}
}
}
else{
for(int q=0;q<p2*j;q++){
s1[k++] = '*';
}
}
if(p3==1){
for(int q=k-1;q>=0;q--){
cout<<s1[q];
}
}
else{
for(int q=0;q<k;q++){
cout<<s1[q];
}
}
}
}
}
return 0;
}