本文结合PTA专项练习带领读者掌握数组,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。
7-1 字符串逆序
输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。
输入格式:
输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。
输出格式:
在一行中输出逆序后的字符串。
输入样例:
Hello World!
输出样例:
!dlroW olleH
方法一:数组实现
#include <stdio.h> int main() { char c,a[80]; int i=0; while((c=getchar())!='\n') { a[i]=c; i++; } for(int j=i-1;j>=0;j--) { printf("%c",a[j]); } }
方法二:引入gets及strlen
#include <stdio.h> #include <string.h> int main() { char a[80]; gets(a); for(int i=strlen(a)-1;i>=0;i--) printf("%c",a[i]); }
7-2 字符串替换
本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:
原字母 对应字母 A Z B Y C X D W … … X C Y B Z A
输入格式:
输入在一行中给出一个不超过80个字符、并以回车结束的字符串。
输出格式:
输出在一行中给出替换完成后的字符串。
输入样例:
Only the 11 CAPItaL LeTtERS are replaced.
输出样例:
Lnly the 11 XZKRtaO OeGtVIH are replaced.
#include <stdio.h> int main() { char c,a[80],b[80]; int i=0; while((c=getchar())!='\n') { a[i]=c; i++; } for(int j=0;j<=i-1;j++) { if(a[j]>='A'&&a[j]<='Z') { b[j]='A'+'Z'-a[j]; } else b[j]=a[j]; printf("%c",b[j]); } }
7-3 统计字符出现次数
本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。
输入格式:
输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。
输出格式:
在一行中输出给定字符在给定字符串中出现的次数。
输入样例:
programming is More fun!
m
输出样例:
2
方法一:数组实现
#include <stdio.h> int main() { char a[80],c,d; int i=0,count=0; while((c=getchar())!='\n') { a[i]=c; i++; } d=getchar(); for(int j=i-1;j>=0;j--) { if(d==a[j]) count++; } printf("%d",count); }
方法二:引入gets及strlen
#include <stdio.h> #include <string.h> int main() { char a[80],c; int count=0; gets(a); c=getchar(); for(int i=0;i<strlen(a);i++) { if(a[i]==c) { count++; } } printf("%d",count); }
7-4 IP地址转换
一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。
输入格式:
输入在一行中给出32位二进制字符串。
输出格式:
在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。
输入样例:
11001100100101000001010101110010
输出样例:
204.148.21.114
#include <stdio.h> #include <math.h> int main() { char a[33]; int t=7;//当前处理的二进制位在8位中的位置 int sum=0;//当前部分的十进制结果 gets(a); for(int i=0;i<32;i++) { a[i]=a[i]-48;//将字符型的'0'~'1'转换成对应的整型数0~1 sum+=a[i]*pow(2,t); if(t==0)//如果是8位中的最后一位 { printf("%d",sum); t=7; sum=0; if(i!=31) printf("."); } else t--; } }
7-1 删除重复字符
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
#include <stdio.h> #include <string.h> int main() { char a[80]; gets(a); for(int i=0;i<strlen(a)-1;i++) { for(int j=0;j<strlen(a)-1;j++) { if(a[j]>a[j+1]) { char t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } }//冒泡排序得到abccc //如果前后不一致就打印出来 所以得到abc for(int i=0;i<strlen(a);i++) { if(a[i]!=a[i+1]) printf("%c",a[i]); } }
7-2 说反话-加强版
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
#include<stdio.h> #include<string.h> int main() { char a[500001],b[500001]; gets(a); // 输入字符串 int i,c,j; int count=0; for(i=0;a[i]==' ';i++) // 计算开头的连续空格数 { count++; } for(i=strlen(a)-1;i>=0;) { if(a[i]!=' ') { c=0; b[0]='\0'; while(a[i]!=' '&&i>=0) // 提取单词 { b[c++]=a[i--]; } //类似于把come中e、m、o、c分别放入b数组 //此时b数组为emoc,将其逆序输出即可 for(j=c-1;j>=0;j--) // 逆序输出单词 { printf("%c",b[j]); } if(count==i+1) ; // 如果开头有空格则不输出 else printf(" "); // 输出单词之间的空格 } else i--; } }
7-3 数组-回文串
回文串是正着读和反着读都一样的字符串,例如“level”“noon”这些都是回文串,
现在希望你能找出输入的所有字符串中的回文串。
输入格式:
第一行为一个正整数N(0 < N <= 1000),表示有N个字符串,
接下来N行每行都是一个字符串(每个字符串长度不超过1000)。
输出格式:
输出所有是回文串的字符串,每输出一个字符串输出一个回车,包括最后一个字符串。
输入样例1:
3
abcabc
AbbbbA
cccc
输出样例1:
AbbbbA
cccc
#include <stdio.h> #include <string.h> int main() { int n;scanf("%d",&n); getchar();//读取数字到字符串的换行符 避免回车的影响 for(int i=0;i<n;i++) { char a[1001]; gets(a); int len=strlen(a); if(a[len-1]=='\n')//将字符串到字符串的换行符去掉 { a[len-1]='\0'; len--; } int flag=0; for(int i=0;i<len/2;i++) { if(a[i]!=a[len-i-1]) { flag=1; break; } } if(flag==0) printf("%s\n",a); } }
7-4 数组-无聊的菇菇一族
戈壁上只居住着菇菇一族们,于是菇菇们实在太无聊了,除了吃饭,睡觉,菇菇们天天都无所事事。于是菇菇们想出了一个方法来消磨时间。菇菇们分成几组,每组按一定顺序排列,按从最后一个到第一个的顺序报出菇菇们的名字。报错的一组菇菇将要接受打理节操田地一周的惩罚(太可怕了>.<)。你能帮帮他们么?
输入格式:
第一行包括一个正整数N,表示有N组菇菇。
接下来N行每行包含一个字符串(长度小于100,仅包含小写字母),每个字母表示一个菇菇的名字。
输出格式:
输出N行,每行为该组菇菇报名字的顺序。
输入样例:
2
abcd
sama
输出样例:
dcba
amas
#include <stdio.h> #include <string.h> int main() { int n;scanf("%d",&n); getchar(); for(int i=1;i<=n;i++) { char a[100]; gets(a); for(int i=strlen(a)-1;i>=0;i--) { printf("%c",a[i]); } printf("\n"); } }
7-5 数组-文本加密
某特工提供了一段文本,按照以下规则对逐个字符进行加密(称为密文):首先将大小写进行切换(大写转换成小写、小写转换成大写),之后再将字母替换成字母表中两位之前的字母,如‘c’替换成‘a’,‘b’替换成‘z’,‘A’替换成‘Y’。同时,该特工也提供了该密文的解析,请判断该解析是否正确。
输入格式:
输入仅一行,包含两个字符串,中间以一个逗号“,”隔开。每个字符串的长度分别不超过10000个字符,仅包含26个字母(含大小写字母‘a’-‘z’和大写字母‘A’-‘Z’),且保证两个字符的长度相等。
输出格式:
判断密文解析是否正确,正确则输出“Yes”,错误则输出“No”。
输入样例:
ccAAbB,AAyyZz
输出样例:
Yes
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { char a[10001], b[10001], c[10001]; scanf("%[^,],%s",a,b); int len=strlen(a); for (int i=0;i<len;i++) { // 切换大小写 if (isupper(a[i])) c[i]=tolower(a[i]); else c[i]=toupper(a[i]); // 字母替换 if(isalpha(a[i])) if(c[i]=='A'||c[i]=='B'||c[i]=='a'||c[i]=='b') c[i]=c[i]+24; else if((c[i]>='C'&&c[i]<='Z')||(c[i]>='c'&&c[i]<='z')) c[i]=c[i]-2; } c[len] = '\0'; if(strcmp(b,c)==0) { printf("Yes"); } else { printf("No"); } }
7-6 数组-动车上
就这样,阿翔和阿花分手了,阿翔独自一人登上了开往福大的动车……
阿翔刚在自己的座位上坐下,便听到一声问候:“同学,你好。”阿翔扭过头一看,见身旁是一美女,内心暗喜,吞吞吐吐地说:“你……你好……请问有什么事么?”女生说:“能不能麻烦你和我的朋友换个位置?”阿翔一愣,顺着她所指方向望去,见一帅哥。阿翔强装笑颜,答道:“好的。”
阿翔坐在帅哥的座位上,耳边萦绕着那对情侣的欢声笑语。他默默地从书包里掏出那叠英语卷。这一次,为了证明自己的帅气,阿翔要更华丽地调教这些考卷——
对于一个字符串S,设其第i个字符为Si,将每k个连续字符划分为一组,则{S0,S1,…,S(k-1)}为第0组,{Sk,S(k+1),…,S(2k-1)}为第1组,以此类推。阿翔要做的就是将第i组(i从0开始)字符逆置i次(逆置即倒序,如将abc置为cba)。若字符串剩下的字符不够凑成一组,则不对这些字符进行操作。
输入格式:
第一行为一个正整数k(大小不限,可能超过字符串长度);
第二行为一个字符串(长度不超过100,不含空格)。
输出格式:
输出仅一行,即完成操作后所得的字符串。
输入样例:
5
qwertyuiopasdfghjkl
输出样例:
在这里给出相应的输出。例如:
qwertpoiuyasdfghjkl
#include <stdio.h> #include <string.h> int main() { int k;char c[101];scanf("%d",&k);scanf("%s",c); int len=strlen(c); int a[101]={0};//用于记录字符是否被输出过 int groupcount=len/k-1;//计算分组数量 int j,i; for(j=0;j<=groupcount;j+=2) { //输出每组的前k个字符 for(i=j*k;i<(j+1)*k;i++) { if(i>=len) break; printf("%c",c[i]); a[i]++; } //逆序输出每组的后k个字符 for(i=(j+2)*k-1;i>=(j+1)*k;i--) { if(i>=len) break; printf("%c",c[i]); a[i]++; } } for(i=0;i<len;i++) { if(a[i]==0) printf("%c",c[i]);//输出没有被标记的字符 } }