//字符串
AcWing 760. 字符串长度
给定一行长度不超过 100 的非空字符串,请你求出它的具体长度。
输入格式
输入一行,表示一个字符串。注意字符串中可能包含空格。
输出格式
输出一个整数,表示它的长度。
字符串末尾无回车
输入样例:
I love Beijing.
输出样例:
15
思路:直接用getline()读入字符串,后用s.size()计算字符串长度
方案1:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
getline(cin,s);
cout<<s.size()<<endl;
return 0;
}
方案2:
(fgets函数会把回车也读进来)
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[105];
int c = 0;
fgets(s , 105 , stdin);
for(int i = 0;s[i] && s[i] != '\n';i ++) c ++;
cout << c << endl;
return 0;
}
761. 字符串中的数字个数
输入一行字符,长度不超过100,请你统计一下其中的数字字符的个数。
输入格式
输入一行字符。注意其中可能包含空格。
输出格式
输出一个整数,表示字数字字符的个数。
输入样例:
I am 18 years old this year.
输出样例:
2
解法1:常规套路,遍历一遍整个序列,判断是否有数字
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
int cnt = 0,T;
getline(cin,s);
for(int i = 0;i < s.size();i++)
{
if(s[i] >='0' && s[i] <='9')
{
cnt++;
}
}
cout<<cnt;
return 0;
}
解法2:
思路:用isdigit()判断
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
int cnt = 0;
getline(cin, s);
for(char c:s)//复制一个s字符串再进行遍历操作,但是复制一个字符串需要花费大量的时间,支持C++11
{
if(isdigit(c))
{
cnt++;
}
}
cout<<cnt;
return 0;
}
这道题还可以运用auto
for(auto a:b)中b为一个容器,效果是利用a遍历并获得b容器中的每一个值,但是a无法影响到b容器中的元素。
for(auto &a:b)中加了引用符号,可以对容器中的内容进行赋值,即可通过对a赋值来做到容器b的内容填充。
765. 字符串加空格
给定一个字符串,在字符串的每个字符之间都加一个空格。
输出修改后的新字符串。
输入格式
共一行,包含一个字符串。注意字符串中可能包含空格。
输出格式
输出增加空格后的字符串。
输入样例:
test case
输出样例:
t e s t c a s e
为方便熟悉for(char c:s)的用法,这也算一道练习题
//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s;
getline(cin,s);
for(char c : s) cout<<c<<" ";
return 0;
}
763. 循环相克令(模拟题)
循环相克令是一个两人玩的小游戏。
令词为“猎人、狗熊、枪”,两人同时说出令词,同时做出一个动作——猎人的动作是双手叉腰;狗熊的动作是双手搭在胸前;枪的动作是双手举起呈手枪状。
双方以此动作判定输赢,猎人赢枪、枪赢狗熊、狗熊赢猎人,动作相同则视为平局。
现在给定你一系列的动作组合,请你判断游戏结果。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
接下来 T 行,每行包含两个字符串,表示一局游戏中两人做出的动作,字符串为 Hunter
, Bear
, Gun
中的一个,这三个单词分别代表猎人,狗熊和枪。
输出格式
如果第一个玩家赢了,则输出 Player1
。
如果第二个玩家赢了,则输出 Player2
。
如果平局,则输出 Tie
。
输入样例
3
Hunter Gun
Bear Bear
Hunter Bear
输出样例
Player1
Tie
Player2
解法1:用长度来判断是否符合条件
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin>>T;
string a,b;
while(T--)
{
cin>>a>>b;
int soso = a.size(), alaso = b.size();
if (soso - alaso == -1 || soso - alaso == -2 || soso - alaso == 3)
cout << "Player1" << endl;
else if (a == b)
cout << "Tie" << endl;
else cout << "Player2" << endl;
}
return 0;
}
解法2:
直接定义字符串,直接模拟即可
#include<bits/stdc++.h>
using namespace std;
int main ()
{
int T;
cin>>T;
while(T--)
{
string a,b;
cin>>a>>b;
if(a==b)puts("Tie");
else if(a=="Hunter"&&b=="Gun"||a=="Bear"&&b=="Hunter"||a=="Gun"&&b=="Bear")
puts("Player1");
else puts("Player2");
}
return 0;
}
773. 字符串插入
有两个不包含空白字符的字符串 str 和 substr,str的字符个数不超过 10,substr 的字符个数为 33。(字符个数不包括字符串结尾处的 \0
。)
将 sub str 插入到 str 中 ASCII 码最大的那个字符后面,若有多个最大则只考虑第一个。
输入格式
输入包括若干行,每一行为一组测试数据,格式为
str substr
输出格式
对于每一组测试数据,输出插入之后的字符串。
输入样例:
abcab eee
12343 555
输出样例:
abceeeab
12345553
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s,sub;
while(cin>>s>>sub)
{
int idx = 0;
for(int i = 0;i<s.size();i++)
if(s[i] > s[idx])
{
idx = i;
}
s.insert(idx+1,sub);//insert()函数表示插入
//比如insert(i,s) 在原串下标为i的字符串str前插入字符串s
cout<<s<<endl;
}
return 0;
}
772. 只出现一次的字符
给你一个只包含小写字母的字符串。
请你判断是否存在只在字符串中出现过一次的字符。
如果存在,则输出满足条件的字符中位置最靠前的那个。
如果没有,输出 no
。
输入格式
共一行,包含一个由小写字母构成的字符串。
数据保证字符串的长度不超过 100000。
输出格式
输出满足条件的第一个字符。
如果没有,则输出 no
。
输入样例:
abceabcd
输出样例:
e
#include<bits/stdc++.h>
using namespace std;
const int N = 100001;
int x[N];
int main()
{
int idx = 0;
string s;
cin>>s;
for(auto e:s)
{
x[e]++;
}
for(auto e:s)
{
if(x[e] == 1)
{
cout<<e<<endl;
return 0;
}
}
cout<<"no"<<endl;
}
768. 忽略大小写比较字符串大小
一般我们用 strcmp 可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按 ASCII 码值大小比较),直到出现不同的字符或遇到 \0
为止。
如果全部字符都相同,则认为相同;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。
但在有些时候,我们比较字符串的大小时,希望忽略字母的大小,例如 Hello
和 hello
在忽略字母大小写时是相等的。
请写一个程序,实现对两个字符串进行忽略字母大小写的大小比较。
输入格式
输入为两行,每行一个字符串,共两个字符串。注意字符串中可能包含空格。
数据保证每个字符串的长度都不超过 8080。
输出格式
如果第一个字符串比第二个字符串小,输出一个字符 <
。
如果第一个字符串比第二个字符串大,输出一个字符 >
。
如果两个字符串相等,输出一个字符 =
。
输入样例:
Hello
hello
输出样例:
=
思路:直接遍历两个字符串即可
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
string a,b;
getline(cin,a);
getline(cin,b);
for(int i = 0;i < a.size();i++)
if(a[i] >= 'A' && a[i] <= 'Z') a[i] += 32;
for(int i = 0;i < b.size();i++)
if(b[i] >= 'A' && b[i] <= 'Z')b[i] += 32;
int c;
c = strcmp(a.c_str(),b.c_str());
if(c < 0) cout<<"<";
else if(c == 0)cout<<"=";
else if(c > 0) cout<<">";
return 0;
}
767. 信息加密
在传输信息的过程中,为了保证信息的安全,我们需要对原信息进行加密处理,形成加密信息,从而使得信息内容不会被监听者窃取。
现在给定一个字符串,对其进行加密处理。
加密的规则如下:
- 字符串中的小写字母,a 加密为 b,b 加密为 c,…,y 加密为 z,z加密为 a。
- 字符串中的大写字母,A 加密为 B,B加密为 C,…,Y 加密为Z,Z 加密为 A。
- 字符串中的其他字符,不作处理。
请你输出加密后的字符串。
输入格式
共一行,包含一个字符串。注意字符串中可能包含空格。
输出格式
输出加密后的字符串。
数据范围
输入字符串的长度不超过 100。
输入样例:
Hello! How are you!
输出样例:
Ifmmp! Ipx bsf zpv!
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a;
getline(cin,a);
for(int i = 0;i < a.size();i++)
{
if(a[i] >= 'A' && a[i]<'Z'||a[i]>='a'&&a[i]<'z') a[i]++;
else if(a[i] == 'Z' || a[i] == 'z') a[i] -= 25;
}
cout<<a;
return 0;
}
64. 输出字符串
给定一个字符串 a,请你按照下面的要求输出字符串 bb。
给定字符串 a 的第一个字符的 ASCII 值加第二个字符的 ASCII 值,得到 b 的第一个字符;
给定字符串 a 的第二个字符的 ASCII 值加第三个字符的 ASCII 值,得到b 的第二个字符;
…
给定字符串 a 的倒数第二个字符的 ASCII 值加最后一个字符的 ASCII 值,得到 b 的倒数第二个字符;
给定字符串 a 的最后一个字符的 ASCII 值加第一个字符的 ASCII 值,得到b 的最后一个字符。
输入格式
输入共一行,包含字符串 a。注意字符串中可能包含空格。
数据保证字符串内的字符的 ASCII 值均不超过 63。
输出格式
输出共一行,包含字符串b。
输入样例:
1 2 3
输出样例:
QRRSd
思路:一般像有固定长度,依次向后的取,到最后面,再从第一个开始取,这种模型一般都可以用取余
可以参考蛇形矩阵那道题
0->1 1->2......n-1->n n->0 可以用 i=(i+1)%(n+1)实现
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a,b;
getline(cin,a);//读入空格所需要的读入语句(对于字符串来说)
for(int i = 0;i < a.size();i++)
b += a[i]+a[(i+1)%a.size()];
cout<<b;
return 0;
}
AcWing 775. 倒排单词
编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。
输入格式
输入为一个字符串(字符串长度至多为100)。
输出格式
输出为按要求排序后的字符串。
输入样例:
I am a student
输出样例:
student a am I
思路:
res = I
res = am I
res = a am I
…
每次拼接都是用str往res的前面拼接,拼接的中间还要加上’ ‘(空格字符)
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str,std;
while(cin>>str)
std = str +' '+ std;
cout<<std;
return 0;
}