字符串训练赛
A题 大写单词
题目链接 https://nyoj.online/problem/CF-281A
大写第一个单词
#include <stdio.h>
char a[1050];
int main()
{
scanf("%s",a);//字符串不需要取地址符
if(a[0]>='a') a[0]-=('a'-'A');//转化为大写
printf("%s",a);
return 0;
}
B题 乘1000
题目链接 https://nyoj.online/problem/NYOJ-1610
这题用longlong存会爆数据, 得用字符串输出
#include <stdio.h>
char str[50];
int main()
{
scanf("%s",str);
printf("%s000",str);
return 0;
}
C题 对不对
题目链接 https://nyoj.online/problem/CF-1703A
注意到很多同学直接打表写法(自己手动吧全部可能性写出来)粗心写错了
这题直接把字母转化成小写在判断最好
#include <stdio.h>
char str[50];
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
scanf("%s",str);
for(int i=0;i<3;i++)
if(str[i]>='a') str[i]-=('a'-'A');
if(strcmp("YES",str)==0) puts("YES");
else puts("NO");
}
return 0;
}
D题 我真的想不起来标题了
题目链接 https://nyoj.online/problem/NYOJ-1612
使用%c的时候记得在输入前使用getchar()把换行符吃掉, 不然会让%c读取你的换行符
#include <stdio.h>
char str[150];
char cnt;
int n;
int main()
{
scanf("%d%s",&n,str);
getchar();//吃换行符
scanf("%c",&cnt);
for(int i=0;i<n;i++)
if(str[i]==cnt) str[i]='#';
puts(str);
return 0;
}
E题 翻转吧字符串。
题目链接 https://nyoj.online/problem/NYOJ-1613
用for反着遍历输出即可
#include <stdio.h>
char str[150];
int n;
int main()
{
scanf("%d%s",&n,str);
for(int i=n-1;i>=0;i--)
printf("%c",str[i]);
return 0;
}
F题 回文串
题目链接 https://nyoj.online/problem/NYOJ-1614
利用了计算机除法向下取整的机制(忽略小数位)使奇偶长度字符串处理一致, 之后判断是否相等, 使用flag记录回文即可
#include <stdio.h>
char str[150];
int n,flag;//全局变量在堆中定义, 自动初始化为0
int main()
{
scanf("%d%s",&n,str);
for(int i=0;i<n/2;i++)
if(str[i]!=str[n-i-1])
{
flag=1;
break;
}
puts(flag?"NO":"YES");
/*
相当于
if(flag==1) puts("YES");
else puts("NO");
*/
return 0;
}
G题 lklklk = k
题目链接 https://nyoj.online/problem/NYOJ-1615
使用了哈希表的思想, hash[ str[i] ]记录了str[i]这个字母出现了几次, 最后使i从'a'到'z'遍历搜索最大值, 输出即可
#include <stdio.h>
char str[150];
int n,hash[150],mmax,ans;
int main()
{
scanf("%d%s",&n,str);
for(int i=0;i<n;i++)
hash[str[i]]++;
for(int i='a';i<='z';i++)
if(mmax<hash[i])
{
mmax=hash[i];
ans=i;
}
printf("%c",(char)ans);
return 0;
}
H题 快来教教why学长用9键!
题目链接 https://nyoj.online/problem/NYOJ-1616
这题巧用switch打表会比if-else语句简便很多
#include <stdio.h>
#include <string.h>
char a[50];
int main()
{
scanf("%s",a);
int i=0;
while(i<strlen(a))
{
switch(a[i])
{
case 'a':
case 'b':
case 'c':printf("2 %d\n",a[i]-'a'+1);break;
case 'd':
case 'e':
case 'f':printf("3 %d\n",a[i]-'d'+1);break;
case 'g':
case 'h':
case 'i':printf("4 %d\n",a[i]-'g'+1);break;
case 'j':
case 'k':
case 'l':printf("5 %d\n",a[i]-'j'+1);break;
case 'm':
case 'n':
case 'o':printf("6 %d\n",a[i]-'m'+1);break;
case 'p':
case 'q':
case 'r':
case 's':printf("7 %d\n",a[i]-'p'+1);break;
case 't':
case 'u':
case 'v':printf("8 %d\n",a[i]-'t'+1);break;
case 'w':
case 'x':
case 'y':
case 'z':printf("9 %d\n",a[i]-'w'+1);break;
}
i++;
}
return 0;
}
I题 输出亲朋字符串
题目链接 https://nyoj.online/problem/NYOJ-1608
这题注意输入是有空格的, 这题的数据空格也必须要被处理, 只有使用gets才能读入空格
c++中是使用fgets
#include <stdio.h>
#include <string.h>
char str[150];
int n;
int main()
{
gets(str);//c++中为fgets
n=strlen(str);
for(int i=0;i<n-1;i++)
printf("%c",str[i]+str[i+1]);
printf("%c",str[0]+str[n-1]);
return 0;
}
J题 rap序列(防ak?)
题目链接 https://nyoj.online/problem/NYOJ-1611
这题并不是简简单单的找有多少个r多少个a和p, 而是寻找有多少个rap组合
题解见注释
#include <stdio.h>
char str[150];
int n,r,ra,rap;
int main()
{
scanf("%d%s",&n,str);
for(int i=0;i<n;i++)
{
r+=str[i]=='r';//如果str=='r'判断式返回值为1, 否则为0 此处查找有多少种r
if(str[i]=='a') ra+=r;//查找有多少种ra组合
if(str[i]=='p') rap+=ra;//有多少个p能和前面的ra组合成rap
}
printf("%d",rap);
return 0;
}
除此之外还可以三重循环暴力查找, 这题数据不大, 完全能暴力
#include <stdio.h>
int main()
{
int n,cnt=0;
char in[1000];
scanf("%d%s",&n,in);
int len=strlen(in);
for(int i=0;i<len;i++)
{
if(in[i]=='r')
{
for(int j=i+1;j<len;j++)
{
if(in[j]=='a')
{
for(int k=j+1;k<len;k++)
{
if(in[k]=='p')
{
cnt++;
}
}
}
}
}
}
printf("%d",cnt);
return 0;
}