题解 | 字符串展开

字符串展开

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;
} 
  • 直接模拟,注意--连着的情况
  • 先完成整体逻辑,最后再写特殊情况处理
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务