csp信奥赛C++高频考点专项训练之字符串 --【字符统计】:密码合规
csp信奥赛C++高频考点专项训练之字符串 --【字符统计】:密码合规
题目描述
网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求 :
只能由a ∼ z \texttt a \sim \texttt za∼z之间26 2626个小写字母、A ∼ Z \texttt A \sim \texttt ZA∼Z之间26 2626个大写字母、0 ∼ 9 0 \sim 90∼9之间10 1010个数字以及
!@#$四个特殊字符构成。密码最短长度: 6 :6:6个字符,密码最大长度: 12 :12:12个字符。
大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。
输入格式
输入一行不含空格的字符串。约定长度不超过100 100100。该字符串被英文逗号分隔为多段,作为多组被检测密码。
输出格式
输出若干行,每行输出一组合规的密码。输出顺序以输入先后为序,即先输入则先输出。
输入输出样例 1
输入 1
seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!输出 1
seHJ12!@ sjdkffH$123说明/提示
【样例 1 解释】
输入被英文逗号分为了四组被检测密码:seHJ12!@、sjdkffH$123、sdf!@&12HDHa!、123&^YUhg@!。其中sdf!@&12HDHa!长度超过 12 个字符,不合规;123&^YUhg@!包含四个特殊字符之外的字符不合规。
思路分析
本题要求从一行用逗号分隔的字符串中提取出多个密码,然后逐个判断是否符合三条规则:
- 字符范围:只能包含
a~z、A~Z、0~9以及!@#$四个特殊字符。 - 长度:6~12 个字符。
- 组成种类:大写字母、小写字母、数字至少包含两种,并且至少包含一个特殊字符(
!@#$)。
思路如下:
- 遍历字符串,遇到逗号就表示一个密码结束,将前面累积的
tmp进行检验;否则将字符追加到tmp中。 - 循环结束后还需要检验最后一个密码(因为末尾没有逗号)。
- 检验函数
check中,用五个标志分别记录:小写字母x、大写字母d、数字sz、特殊字符f、非法字符q。遍历密码的每个字符,设置相应标志。 - 最后按照顺序判断:有非法字符 → 长度不合规 → 字母数字种类不足 → 缺少特殊字符。全部通过则返回
true。
二、带注释的代码
#include<bits/stdc++.h>usingnamespacestd;string s,tmp;// 检查密码是否合规boolcheck(string s){intx=0,d=0,sz=0,f=0,q=0;// 分别标记:小写、大写、数字、特殊、非法intn=s.size();for(inti=0;i<n;i++){if(s[i]>='a'&&s[i]<='z')x=1;// 小写字母elseif(s[i]>='A'&&s[i]<='Z')d=1;// 大写字母elseif(s[i]>='0'&&s[i]<='9')sz=1;// 数字elseif(s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$')f=1;// 合法特殊字符elseq=1;// 非法字符}// 规则1:不能有非法字符if(q==1)returnfalse;// 规则2:长度必须在6~12之间if(n<6||n>12)returnfalse;// 规则3:大写、小写、数字至少两种if(x+d+sz<2)returnfalse;// 规则3:至少有一个特殊字符if(f==0)returnfalse;// 所有规则满足returntrue;}intmain(){cin>>s;intn=s.size();for(inti=0;i<n;i++){if(s[i]!=','){tmp+=s[i];// 不是逗号就继续累积}else{if(check(tmp))cout<<tmp<<endl;// 遇到逗号,检验前面的密码tmp="";// 清空,准备下一个密码}}// 最后一个密码(末尾没有逗号)if(check(tmp))cout<<tmp<<endl;return0;}三、功能分析
- 输入处理:通过
cin直接读取一行,因为题目保证输入不含空格,所以可以安全使用cin >> s。如果输入中包含空格(本题没有),则应该改用getline,但当前代码完全满足题目要求。 - 密码拆分:手动遍历字符串,以逗号为分隔符将每个密码提取到临时字符串
tmp中。 - 合规检查:
check函数对每个密码独立判断,按照“非法字符 → 长度 → 字母数字种类 → 特殊字符”的顺序返回结果。该顺序保证了所有条件都会被检查,并且效率较高(单次遍历)。 - 输出:按输入顺序输出所有合法的密码,每行一个。
【完整系列请查看专栏】:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
各种学习资料,助力大家一站式学习和提升!!!
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转
2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转
https://edu.csdn.net/course/detail/41081 点击跳转
3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转
4、csp信奥赛冲刺一等奖有效刷题题解:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++提高组csp-j初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转
5、GESP C++考级真题题解:
GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转
GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转
GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转
· 文末祝福 ·
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}