字符串题目合集(上)
ps:会把洛谷和acwing上的所有字符串的题目都刷一遍,分为上中下发一下,这篇博客写的比较粗略,明天等我醒了补充点知识点啥的
关于复习字符串的初衷还是因为对其掌握不牢,而字符串又是校赛的必考题,所以希望在校赛前把字符串的题目都刷一遍(至少不会爆零hhh)
文章目录
1.字符串的长度
题目
给定一行长度不超过 100 的非空字符串,请你求出它的具体长度。
输入格式
输入一行,表示一个字符串。注意字符串中可能包含空格。
输出格式
输出一个整数,表示它的长度。
输入样例:
I love Beijing.
输出样例:
15
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
char s[101];
fgets(s,101,stdin);
//表示一共读多少字符
int len=0;
for(int i=0;s[i]&&s[i]!='\n';i++)
{//因为fgets会把回车读进来,所以要写s[i]!='\n'
len++;
}
printf("%d\n",len);
return 0;
}
注:关于fgets(),感觉这位博主写的不错大佬写的fgets详解(我是个搬运工)
2.字符串中的数字个数
题目
输入一行字符,长度不超过 100,请你统计一下其中的数字字符的个数。
输入格式
输入一行字符。注意其中可能包含空格。
输出格式
输出一个整数,表示字数字字符的个数。
输入样例:
I am 18 years old this year.
输出样例:
2
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
char s[101];
fgets(s,101,stdin);
int sum=0;
for(int i=0;s[i];i++)
{
if(s[i]>='0'&&s[i]<='9')
{
sum++;
}
}
cout<<sum<<endl;
return 0;
}
3.循环相克令
题目
循环相克令是一个两人玩的小游戏。
令词为“猎人、狗熊、枪”,两人同时说出令词,同时做出一个动作——猎人的动作是双手叉腰;狗熊的动作是双手搭在胸前;枪的动作是双手举起呈手枪状。
双方以此动作判定输赢,猎人赢枪、枪赢狗熊、狗熊赢猎人,动作相同则视为平局。
现在给定你一系列的动作组合,请你判断游戏结果。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
接下来 T 行,每行包含两个字符串,表示一局游戏中两人做出的动作,字符串为 Hunter
, Bear
, Gun
中的一个,这三个单词分别代表猎人,狗熊和枪。
输出格式
如果第一个玩家赢了,则输出 Player1
。
如果第二个玩家赢了,则输出 Player2
。
如果平局,则输出 Tie
。
数据范围
1 ≤ N ≤ 100
输入样例
3
Hunter Gun
Bear Bear
Hunter Bear
输出样例
Player1
Tie
Player2
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
string a,b;
cin>>a>>b;
int x,y;
if(a=="Hunter")
{
x=0;
}
else if(a=="Bear")
{
x=1;
}
else
x=2;
if(b=="Hunter")
{
y=0;
}
else if(b=="Bear")
{
y=1;
}
else
y=2;
if(x==y)
{
puts("Tie");
}
else if (x == (y + 1) % 3)
{
puts("Player1");
}
else
puts("Player2");
}
return 0;
}
4.字符串加空格
题目
给定一个字符串,在字符串的每个字符之间都加一个空格。
输出修改后的新字符串。
输入格式
共一行,包含一个字符串。注意字符串中可能包含空格。
输出格式
输出增加空格后的字符串。
数据范围
1≤字符串长度≤1001≤字符串长度≤100
输入样例:
test case
输出样例:
t e s t c a s e
AC代码
#include<iostream>
using namespace std;
int main()
{
string a;
getline(cin,a);
string b;
for(auto c : a)
{
b=b+c+' ';
}
b.pop_back();//把最后一个字符删掉
cout<<b<<endl;
return 0;
}
5.替换字符
题目
给定一个由大小写字母构成的字符串。
把该字符串中特定的字符全部用字符 #
替换。
请你输出替换后的字符串。
输入格式
输入共两行。
第一行包含一个长度不超过 30 的字符串。
第二行包含一个字符,表示要替换掉的特定字符。
输出格式
输出共一行,为替换后的字符串。
输入样例:
hello
l
输出样例:
he##o
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char str[35];
scanf("%s\n",str);
char c;
scanf("%c",&c);
for(int i=0;str[i];i++)
{
if(str[i]==c)
str[i]='#';
}
puts(str);
return 0;
}
6.字符串插入
题目
有两个不包含空白字符的字符串 strstr 和 substrsubstr,strstr 的字符个数不超过 1010,substrsubstr 的字符个数为 33。(字符个数不包括字符串结尾处的 \0
。)
将 substrsubstr 插入到 strstr 中 ASCII 码最大的那个字符后面,若有多个最大则只考虑第一个。
输入格式
输入包括若干行,每一行为一组测试数据,格式为
str substr
输出格式
对于每一组测试数据,输出插入之后的字符串。
输入样例:
abcab eee
12343 555
输出样例:
abceeeab
12345553
AC代码
#include<iostream>
using namespace std;
int main()
{
string a,b;
while(cin>>a>>b)
{
int p=0;
for(int i=1;i<a.size();i++)
{
if(a[i]>a[p])
p=i;
}
cout<<a.substr(0,p+1)+b+a.substr(p+1)<<endl;
}
return 0;
}
7.只出现一次的字符
题目
给你一个只包含小写字母的字符串。
请你判断是否存在只在字符串中出现过一次的字符。
如果存在,则输出满足条件的字符中位置最靠前的那个。
如果没有,输出 no
。
输入格式
共一行,包含一个由小写字母构成的字符串。
数据保证字符串的长度不超过 100000。
输出格式
输出满足条件的第一个字符。
如果没有,则输出 no
。
输入样例:
abceabcd
输出样例:
e
AC代码
#include<cstring>
#include<iostream>
using namespace std;
char str[100010];
int cnt[26];
int main()
{
int len=strlen(str);
cin>>str;
for(int i=0;str[i];i++)
{
cnt[str[i]-'a']++;
}
for(int i=0;str[i];i++)
{
if(cnt[str[i]-'a']==1)
{
cout<<str[i]<<endl;
return 0;
}
}
puts("no");
return 0;
}