6翻了——初心者用

it2023-11-09  77

  这是一个很单纯的字符串替换的题,不涉及特殊输出格式,这里C可以用getchar()输入并记录长度,C++使用string头文件的getline()即可,代码分别如下:

//c style #include<stdio.h> ... char s[1100]; char t; //temp,表临时变量 int cnt=0; //count,表计数变量 while((t=getchar())!='\n')s[cnt++]=t; //注意这句的括号位置(用来调整运算优先级),判断条件,自加运算符的用法

  这里要注意将字符串数组开大一点,省去声明数组长度的麻烦

//cpp style #include<string> #include<iostream> using namespace std; ... string s; getline(cin,s); //理解输入流作为函数参数

  然后重点是判断并处理连续6的情况。   这里要注意先处理转换成27的情况,再处理转换成9的情况。否则,本应转换成27的序列会变成至少3个"9"和不多于4个"6"的序列,这个处理起来就挺繁琐的。   再想到,如果转换发生,一串较长的"6"会变短,整个字符串数组的长度就减少了,那么被缩短的部分要变成什么呢?

具体地,考虑s[i,i+9]="66666666",转换后子串变为s[i,i+1]="9",那么s[i+1,i+9]该怎么办呢?

  这时候我们想到,只要在s[i+1,i+9]上做个标记,当遇到这个标记时,不输出就可以了。 考虑到输入的字符串不可能出现控制字符(即ASCII码表中的编码为0-32的字符),我们将s[i+1,i+9]设置为0(注意不是字符"0"),具体代码如下

//c style #include<stdio.h> int main(void){ char s[1100]; char t; //temp,表临时变量 int cnt=0; //count,表计数变量 while((t=getchar())!='\n')s[cnt++]=t; int len=0; //用来记录当前6序列的长度 for(int i=0;i<=cnt;i++) //考虑为什么用<= if(i<cnt&&s[i]=='6')//当前字符属于6序列 len++; else{ //否则,根据序列的长度进行处理 for(int j=i-len;j<i;j++) s[j]=0; if(len>9) {s[j-len]='2';s[j-len+1]='7';} else if(len>3) s[j-len]='9' len=0; //重置序列长度 } for(int i=0;i<cnt;i++) if(s[j])printf("%c",s[j]); return 0; }

事实上,使用c++的regex库,通过正则表达式写出来的代码思路更加自然:

#include<iostream> #include<string> #include<regex> using namespace std; int main(void){ string s; char c; getline(cin,s); regex pattern("6{4,}"),pattern2("6{10,}"); s=regex_replace(s,pattern2,"27"); s=regex_replace(s,pattern,"9"); cout<<ss; return 0; }

正则表达式以后再讲。

最新回复(0)