后面的题目都比较简单啦,但是博主强迫症发作,想都刷完,也可以给之后刷题的同学一些参照。上一篇字符串匹配时没有用KMP算法,下次单独写一篇记录KMP算法,继续刷接下来五道字符串的题目。
问题 E: 字符串去特定字符
时间限制: 1 Sec 内存限制: 32 MB
题目描述
输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果。
输入
测试数据有多组,每组输入字符串s和字符c。
输出
对于每组输入,输出去除c字符后的结果。
样例输入
goaod
a
样例输出
good
解题思路
这道题主要是要解决输入问题。字符数组的输入输出主要有三种方式:
(1)scanf输入,printf输出
(2)getchar输入,putchar输出
使用getchar输入字符后,一定要再加一句getchar()来把输入中每行末尾的换行符吸收掉。
(3)gets输入,puts输出
gets用来输入一行字符串,gets识别换行符\n作为输入结束,因此scanf完一个整数后,如果要使用gets,需要先用getchar接收整数后的换行符,并将其存放于一维数组中,puts用来输出一行字符串,即将一维数组在界面上输出,并紧跟一个换行。
Submission
#include<stdio.h>
#include<string.h>
int main()
{
char str[10000];
char sub;
int i,j;
while(gets(str))
{
char ans[10000]={0};
j=0;
sub=getchar();
getchar();//这句是为了把输入中每行末尾的换行符吸收掉
for(i=0;i<strlen(str);i++)
{
if(sub!=str[i]){
ans[j]=str[i];
j++;
}
else{
continue;
}
}
printf("%s\n",ans);
}
return 0;
}
问题 F: 数组逆置
时间限制: 1 Sec 内存限制: 32 MB
题目描述
输入一个字符串,长度小于等于200,然后将数组逆置输出。
输入
测试数据有多组,每组输入一个字符串。
输出
对于每组输入,请输出逆置后的结果。
样例输入
tianqin
样例输出
niqnait
提示
注意输入的字符串可能会有空格。
解题思路
如果不能用string函数则通过遍历字符串自己实现strlen函数即可。
Submission
#include<stdio.h>
#include<string.h>
int main()
{
char str[201];
char sub;
int i,j;
while(gets(str))
{
for(i=strlen(str)-1;i>=0;i--)
{
printf("%c",str[i]);
}
printf("\n");
}
return 0;
}
问题 G: 比较字符串
时间限制: 1 Sec 内存限制: 32 MB
题目描述
输入两个字符串,比较两字符串的长度大小关系。
输入
输入第一行表示测试用例的个数m,接下来m行每行两个字符串A和B,字符串长度不超过50。
输出
输出m行。若两字符串长度相等则输出A is equal long to B;若A比B长,则输出A is longer than B;否则输出A is shorter than B。
样例输入
2
abc xy
bbb ccc
样例输出
abc is longer than xy
bbb is equal long to ccc
解题思路
Submission
#include<stdio.h>
#include<string.h>
int main()
{
char str1[201];
char str2[201];
int i,j,num;
scanf("%d",&num);
while(num--)
{
scanf("%s %s",str1,str2);
if(strlen(str1)>strlen(str2))
printf("%s is longer than %s\n",str1,str2);
else if(strlen(str1)<strlen(str2))
printf("%s is shorter than %s\n",str1,str2);
else
printf("%s is equal long to %s\n",str1,str2);
}
return 0;
}
问题 H: 编排字符串
时间限制: 1 Sec 内存限制: 32 MB
题目描述
请输入字符串,最多输入4 个字符串,要求后输入的字符串排在前面,例如
输入:EricZ
输出:1=EricZ
输入:David
输出:1=David 2=EricZ
输入:Peter
输出:1=Peter 2=David 3=EricZ
输入:Alan
输出:1=Alan 2=Peter 3=David 4=EricZ
输入:Jane
输出:1=Jane 2=Alan 3=Peter 4=David
输入
第一行为字符串个数m,接下来m行每行一个字符床,m不超过100,每个字符床长度不超过20。
输出
输出m行,每行按照样例格式输出,注意用一个空格隔开。
样例输入
5
EricZ
David
Peter
Alan
Jane
样例输出
1=EricZ
1=David 2=EricZ
1=Peter 2=David 3=EricZ
1=Alan 2=Peter 3=David 4=EricZ
1=Jane 2=Alan 3=Peter 4=David
解题思路
本来开始想用队列来写,实现先进先出即可。然后发现一个二维数组就可以解决,题目中给出了输入字符串的个数范围和长度范围,因此不会有数组越界问题。首先将输入的字符串存入一个二维数组中,再从后往前输出二维数组中的字符串,如果字符串个数小于4,则倒序输出所有字符串如果字符串个数大于4,则输出4个字符串后不再输出,跳出循环。
Submission
#include<stdio.h>
#include<string.h>
int main()
{
char str[101][21]={0};
char sub[21];
int i,j,m,len=0;
scanf("%d",&m);
while(m--){
scanf("%s",sub);
strcpy(str[len],sub);
len++;
for(i=1;i<=len;i++){
if(i>4) break;
printf("%d=%s ",i,str[len-i]);
}
printf("\n");
}
return 0;
}
问题 I: 【字符串】回文串
时间限制: 1 Sec 内存限制: 128 MB
题目描述
读入一串字符,判断是否是回文串。“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
输入
一行字符串,长度不超过255。
输出
如果是回文串,输出“YES”,否则输出“NO”。
样例输入
12321
样例输出
YES
解题思路
从两端往中间进行回文串的比对,可以节省时间。在计算某个字符串的子串中有多少回文串时这种方法比较省时。
Submission
#include<stdio.h>
#include<string.h>
int main()
{
char str[256];
int i,flag,len=0;
while(scanf("%s",str)!=EOF){
flag=0;
len=strlen(str);
for(i=0;i<=len/2;i++){
if(str[i]==str[len-i-1]){
flag=1;
}
else{
flag=0;
break;
}
}
if(flag==0) printf("NO\n");
else printf("YES\n");
}
return 0;
}
这些字符串的题目都是属于比较基础的,要写得又快又准确才行,呼~接下来要练习排序算法啦~加油~