题解 | 字符串展开
字符串展开
https://www.nowcoder.com/practice/7fea6add1afa4d91ad71b3a3f4032880
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
char s[1000005] ;
int p1;//内容
int p2;//重复次数 长度8*26||9*8 240
int p3;//顺序
//0字母
//1数字
//-1其它
int NumOrletter(char c){
if(c>='0'&&c<='9'){
return 1;
}
if(c>='a'&&c<='z'){
return 0;
}
if(c>='A'&&c<='Z'){
return 0;
}
return -1;
}
//遇到'-'
//
//输出好吧不改原来的字符串
void printf_change(int index){
// char s1[250];
int c=0;
int len=strlen(s);
if(index-1<0||index+1>=len){
printf("-");
return;
}
// index为'-'
char left=s[index-1];
char right=s[index+1];
//不是同类型字符 但是是数字或者字母
if(NumOrletter(left)!=-1&&NumOrletter(right)!=-1)
{
if(NumOrletter(left)!=NumOrletter(right)){
printf("-");
return ;
}
}
else{
//不是字母
printf("%c",s[index]);
return ;
}
if(left>=right){
printf("-");
return ;
}
if(left+1==right){
return;
}
char start=left;
if(p1==1){
if(p3==1){
while(start<right){
start++;
if(start==right)break;
for(int i=0;i<p2;i++){
printf("%c",start);
}
}
}
else if(p3==2){
//逆序
while(start<right){
right--;
if(start==right)break;
for(int i=0;i<p2;i++){
printf("%c",right);
}
}
}
}
else if(p1==2){
if(p3==1){
while(start<right){
start++;
if(start==right)break;
for(int i=0;i<p2;i++){
if(start<='z'&&start>='a'){
printf("%c",start-'a'+'A');
}
else{
printf("%c",start);
}
}
}
}
else if(p3==2){
//逆序
while(start<right){
right--;
if(start==right)break;
for(int i=0;i<p2;i++){
if(start<='z'&&start>='a'){
printf("%c",right-'a'+'A');
}
else{
printf("%c",right);
}
}
}
}
}
else if(p1==3){
while(start<right){
right--;
if(start==right)break;
for(int i=0;i<p2;i++){
printf("%c",'*');
}
}
}
}
int main(){
scanf("%d%d%d",&p1,&p2,&p3);
char ch=getchar();
scanf("%s",s);
int len=strlen(s);
//特殊情况
/*当出现一个减号时,若它不位于字符串的开头或结尾、
且其两侧为同类型的字符(都是小写字母或都是数字)、
且右侧字符的 ASCII 码大于左侧字符时,
则需要展开该片段。*/
/*如果右侧字符是左侧字符的直接后继(如 "d-e""d-e" 或 "3-4""3-4" ),
则只需删除减号;
如果右侧字符的 ASCII 码小于等于左侧字符,
则保持原样输出(包含减号)。*/
for(int i=0;i<len;i++){
if(s[i]=='\0'||s[i]=='\n'){
continue;
}
if(s[i]=='-'){
printf_change(i);
}
else{
printf("%c",s[i]);
}
}
return 0;
}
- 直接模拟,注意--连着的情况
- 先完成整体逻辑,最后再写特殊情况处理
