一、题目描述
我有一个长度为 l 的字符串,最开始时,这个字符串由 l 个句号(.
)组成。
我在这个字符串中,将多次把 boy
或者 girl
两单词,依次贴到这个字符串中。
后贴上单词,会覆盖之前贴上的单词,或者覆盖句号。最终,每个单词至少有一个字符没有被覆盖。
请问,一共贴有几个 boy
几个 girl
?
二、输入格式
一行被反复贴有 boy
和 girl
两单词的字符串。
三、输出格式
两行,两个整数。第一行为 boy
的个数,第二行为 girl
的个数。
四、输入输出样例
输入
......boyogirlyy......girl.......
输出
4
2
五、算法思想
这道题我使用了 Switch...case 语句,有点想复杂了,看了各位大神的题解,才醍醐灌顶,恍然大悟~~
先说一下我的思路:
1、用一维字符数组记录字符串,利用 For 循环逐个比较;
2、For 循环中嵌套了 Switch...case 语句进行判断。判断写得有点复杂了,
3、boy 有 'boy'、'bo'、'oy'、'b'、'o'、'y' 多种情况
girl 有 'girl'、'gir'、'irl'、'gi'、'ir'、'rl'、'g'、'i'、'r'、'l' 多种情况
代码
#include<stdio.h>
#include<string.h>
int main(){
char s[255];
scanf("%s",s);
int l = strlen(s);
int boy=0,b=0;//boy记录boy出现次数,b记录在'b'哪个位置出现
int girl=0,g=0;//girl记录girl出现次数,g记录在'g'哪个位置出现
for(int i=0;i<l;i++){
char c = s[i];
switch(c){
case '.':break;
case 'b':
boy++;
b=i;//记录'b'出现的位置
break;
case 'o':
if(b==i-1)break;//构成'bo'重复
//到这里,说明上一个不是'b'
b=i-1; //假设上一个是'b',构成'bo'
boy++;
break;
case 'y':
if(b==i-2)break;//构成'boy'重复
boy++;
break;
case 'g':
girl++;
g=i;
break;
case 'i':
if(g==i-1)break;
g=i-1;
girl++;
break;
case 'r':
if(g==i-2)break;
g=i-2;
girl++;
break;
case 'l':
if(g==i-3)break;
girl++;
break;
default :
break;
}
}
printf("%d\n%d\n",boy,girl);
return 0;
}
看了大佬的思路:
直接用 下标 卡 字符 出现的位置,非常巧妙,每种字符只有出现在特定位置时,才算,巧妙地避免了重复
代码
#include<stdio.h>
#include<string.h>
int main(){
char s[255];
scanf("%s",s);
int l = strlen(s);
int boy=0;
int girl=0;
for(int i=0;i<l;i++){
if(s[i]=='.'){
continue;
}
//每种字符出现在对的位置,只有一种情况,巧妙避免重复
if(s[i]=='b' || s[i+1]=='o' || s[i+2]=='y'){
boy++;
}
if(s[i]=='g' || s[i+1]=='i' || s[i+2]=='r' || s[i+3]=='l'){
girl++;
}
}
printf("%d\n%d\n",boy,girl);
return 0;
}
标签:boy,洛谷,int,单词,P1321,字符串,girl,include
From: https://blog.csdn.net/weixin_73999209/article/details/143648964