本文共 4503 字,大约阅读时间需要 15 分钟。
A
题目大意
一位英雄宣称用用户名中不同字符个数为奇数则为男性,否则为女性
题解
用set存每个字符就可以了
#includeusing namespace std;set st;const int maxn=100+10;char s[maxn];int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>s; int len=strlen(s); for(int i=0;i
B
题目大意
大写键的问题,可能意外按到了出现想不到的糟糕情况
题解
从第二个字符开始进行判断,如果全是大写字母,那么我们需要进行处理,把当前字符串全部进行转化,大写变为小写,小写变为大写
#includeusing namespace std;const int maxn=100+10;char s[maxn];int main(){ cin>>s; int n=strlen(s); int ff=1; for(int i=1;i ='a'&&s[i]<='z'){ ff=0; break; } } if(!ff) cout< <='A'&&s[i]<='Z') s[i]=tolower(s[i]); else s[i]=toupper(s[i]); } cout< <
C
题目大意
判断两个字符串的顺序是否相反
题解
用C++ reverse()函数 反一下 然后判断是否相等即可
#includeusing namespace std;int main(){ string s1,s2; cin>>s1>>s2; reverse(s1.begin(),s1.end()); if(s1==s2) cout<<"YES"<
D
题目大意
判断字符串中大写与小写字符的个数 如果小写字母多 全变为小写 如果大写字符多 全变为大写 如果字符个数相等 也是全变为小写
题解
直接模拟
#includeusing namespace std;int main(){ string s; cin>>s; int n=s.length(); int up=0,low=0; for(int i=0;i ='a'&&s[i]<='z') low++; else up++; } if(low>=up) transform(s.begin(),s.end(),s.begin(),::tolower); else transform(s.begin(),s.end(),s.begin(),::toupper); cout< <
E
题目大意
根据字符串中A和D个数进而判断输赢
题解
不需要遍历两遍,只要求一个字符的个数即可,另一个就是n-ans
#includeusing namespace std;const int maxn=1e5+10;char s[maxn];int main(){ ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; int ans=0; for(int i=0;i >s[i]; if(s[i]=='A') ++ans; } if(ans*2>n) cout<<"Anton"<
F
题目大意
把所有WUB变成空格,如果有几个WUB连在一起,只能有一个空格,输出的开头必须是字母
题解
使用正则表达式
#include#include using namespace std;int main() { string str,str1; while(cin>>str){ str1 = regex_replace(str,regex("(WUB)+")," "); string s; s=regex_replace(str1,regex("^\\s"),""); cout< <
/(^\s*)|(\s*$)/g表示空格开头或者空格结尾
^ 是开始
\s 是空白 * 表示0个或多个 | 是或者 $ 是结尾 g 表示全局
G
题目大意
大致意思就是告诉你n个字符串 问你最少需要多少步 能让所有字符串相同 如果不存在解决方案 直接输出 -1 即可
题解
想想KMP是怎么匹配的 与这个类似 我们可以结合STL进行解题 find函数能找出匹配成功第一个字符的下标 如果没找到 会返回 -1 注意: 我们将每个字符串多拼接一次 存起来 刚开始我是在拼接字符串里面找所有的原字符串 但是这种想法是错的 应该是将所有拼接的字符串与原字符串其中一个比较 然后取所有情况的最小值 然后很巧的就是find()函数所找到的下标正好就是我们需要移动的次数嗷~ (想想KMP算法)
#includeusing namespace std;vector vr,kmp;int n;int main(){ ios::sync_with_stdio(false); cin.tie(0); while(cin>>n){ string s; vr.clear(),kmp.clear(); for(int i=1;i<=n;i++){ cin>>s; vr.push_back(s); s+=s; kmp.push_back(s); } int ff=1; int ans=0,res=0x3f3f3f3f; for(int i=0;i
H
题目大意
给你一个字符串,长度n<=1e5,你要把其中的的某些字母换成大于等于它的任意一个字母(例如a可以换成b到z,不换也可以),使最终这个序列中从开始到最后依次包含abcdefghijklmnopqrstuvwxyz。最后输出的是经修改过后的包含a到z的原字符串
题解
从头开始找 遍历一遍 如果能形成26个字母 那么就跳出循环输出结果
#includeusing namespace std;int main(){ string s; cin>>s; int n=s.length(); int ff=0,ans=0; char ch='a'; for(int i=0;i
I
题目大意
给你一段字符串,用来判断是否出现了字母表所有字母(26个) 大小写不限
题解
大小写不限的话,那么我们直接全变为小写 方便统计 我们用map记录每个字符出现的次数 然后遍历时查看是否有没有出现的字符 如果没有出现的话,那么输出NO,否则输出YES
#includeusing namespace std;int n;char ch;map mp;int main(){ cin>>n; for(int i=0;i >ch; ch=tolower(ch); mp[ch]++; } int ff=1; for(ch='a';ff&&ch<='z';ch++){ if(!mp[ch]) ff=0; } if(ff) cout<<"YES"<
J
题目大意
给你三个字符串,这里我起名为a,b,c 然后我们需要统计a和b中所有字符出现的次数 是否和c中所有字符出现的次数相同
题解
我们可以先将a和b字符串拼接为一个大的字符串ss,然后求出ss字符串的长度与c字符串的长度进行比较 首先,如果长度不相同的话,就没有必要继续判断下去了 直接输出NO
其次,我们对ss和c字符串进行排序 然后我们可以用一个C++ 内置函数 strstr() 这个函数功能挺强的 在区域赛上一个题也是通过这个函数解的话很方便,它能判断一个串是否是另一个串的子串,然后子串是包括本身的
#includeusing namespace std;const int maxn=100+10;char ss[maxn],s1[maxn],s[maxn];int main(){ cin>>ss>>s1>>s; strcat(ss,s1); int n=strlen(ss); int m=strlen(s); sort(ss,ss+n); sort(s,s+m); if(n!=m) cout<<"NO"<
最后注意,字符个数相同,排序之后不是只用判断两个串是否相等就可以了吗?直接ss==c就输出YES,否则输出NO
是不对的,对于字符数组的话,我们是不能直接判断相等,而是需要逐个比较,然而strstr正好有这个功能
不过对于string来说,简直是太简单了,因为确实是可以直接判断相等的! 而且拼接也很容易
具体代码如下:
#includeusing namespace std;int main(){ string ss,s1,s; cin>>ss>>s1>>s; ss=ss+s1; sort(ss.begin(),ss.end()); sort(s.begin(),s.end()); if(ss==s) cout<<"YES"<
学如逆水行舟,不进则退
转载地址:https://chocolate.blog.csdn.net/article/details/100760325 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!