《华为机试在线训练》之密码验证合格程序
来源:互联网 发布:手机游戏盒子软件 编辑:程序博客网 时间:2024/05/21 19:29
题目描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度超2的子串重复
说明:长度超过2的子串
输入描述:
一组或多组长度超过2的子符串。每组占一行
输出描述:
如果符合要求输出:OK,否则输出NG
示例1
输入
021Abc9000021Abc9Abc1021ABC9000021$bc9000
输出
OKNGNGOK
一,长度判断
长度判断是非常简单的,直接调用字符串类的处理函数,使用str.length()函数就可以直接求出长度,比较一下就可以
str.length()>8该表达式为true时继续往下进行判断,反之输出NG。
二,字符种类判断
在这里我讲字符分为四种,一种为0~9,第二种为A~Z,第三种为a~z,第四种为其他字符,编写一个循环,在循环中遍历字符串中每一个字符,判断每一个字符属于哪一种,有相应类别的字符就将其标准flag赋值为1,最后求所有flag的总和,如果总和大于3就认为满足条件,否则不满足条件,输出NG,这样判断还会比较高效的,时间复杂度为o(n),还可以接受。代码如下
bool get_kind(string &str) //种类判断子函数{ int flag1=0,flag2=0,flag3=0,flag4=0; int a=str.length(); for(int i=0;i<a;i++) { if(str[i]>='0'&&str[i]<='9') //判断是否为数字 flag1=1; else { if(str[i]>='A'&&str[i]<='Z') //判断是否为大写字母 flag2=1; else { if(str[i]>='a'&&str[i]<='z') //判断是否为小写字母 flag3=1; else flag4=1; //判断是否为其他字符,赋值标志位为1 } } } if((flag1+flag2+flag3+flag4)>2) //判断最后的种类是否为3种以上,如果是则返回true,否则返回false。 return true; else return false;}三,重复性子串长度判断
首先编写一个子串长度函数,在该函数中处理两个字符串的长度,两个长度相等的话则返回长度值,否则跳出判断继续大循环中的下一次循环。代码如下
size_t getCommLen(string str1, string str2) { size_t i; for (i = 0; i < str1.size() && i < str2.size(); i++) { if (str1[i] != str2[i]) break; } return i;}接着编写求最大长度子串的函数,循环对每一个重复子串的长度进行比较,每一次都取最大重复子串的长度值,最后求得的就是最大的长度。其中使用到了vector的push_back()函数和sort()排序函数,具体的用法在这里就不解释了,可以去百度查阅一下具体用法。最后加一个判断最大长度是否大于2的if else,大于2的就输出false,否则为true。这样就可以完成判断要求。代码如下:
bool get_repeat(string &str){ vector<string> strs; int b=str.size(); for (int i = 0; i <b; i++) { strs.push_back(str.substr(i)); } sort(strs.begin(), strs.end()); int maxLen = 0; int c=strs.size(); for (int i = 0; i < c-1; i++) { int len = getCommLen(strs[i], strs[i+1]); maxLen = max(maxLen, len); } if(maxLen>2) return false; else return true;}
四,输出判断
让字符串满足上面三个子函数的条件才可以最后判断为OK,否则就输出NG,这时一个if条件语句就可以判断完成。代码如下:
if(str.length()>8&&get_kind(str)&&get_repeat(str)) cout<<"OK"<<endl; else cout<<"NG"<<endl;五,完整代码如下;
这里同样要注意测试用例是多组,所以一定要用while循环进行输出,才可以保证每一组测试用例都可以有正确的结果输出。
#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;bool get_kind(string &str);bool get_repeat(string &str);size_t getCommLen(string str1, string str2);int main(){ string str; while(cin>>str) { if(str.length()>8&&get_kind(str)&&get_repeat(str)) cout<<"OK"<<endl; else cout<<"NG"<<endl; } //cout << "Hello world!" << endl; return 0;}bool get_kind(string &str) //种类判断子函数{ int flag1=0,flag2=0,flag3=0,flag4=0; int a=str.length(); for(int i=0;i<a;i++) { if(str[i]>='0'&&str[i]<='9') //判断是否为数字 flag1=1; else { if(str[i]>='A'&&str[i]<='Z') //判断是否为大写字母 flag2=1; else { if(str[i]>='a'&&str[i]<='z') //判断是否为小写字母 flag3=1; else flag4=1; //判断是否为其他字符,赋值标志位为1 } } } if((flag1+flag2+flag3+flag4)>2) //判断最后的种类是否为3种以上,如果是则返回true,否则返回false。 return true; else return false;}bool get_repeat(string &str){ vector<string> strs; int b=str.size(); for (int i = 0; i <b; i++) { strs.push_back(str.substr(i)); } sort(strs.begin(), strs.end()); int maxLen = 0; int c=strs.size(); for (int i = 0; i < c-1; i++) { int len = getCommLen(strs[i], strs[i+1]); maxLen = max(maxLen, len); } if(maxLen>2) return false; else return true;}size_t getCommLen(string str1, string str2) { size_t i; for (i = 0; i < str1.size() && i < str2.size(); i++) { if (str1[i] != str2[i]) break; } return i;}
阅读全文
1 0
- 《华为机试在线训练》之密码验证合格程序
- 华为机试在线训练-牛客网(12)密码验证合格程序
- 华为机试在线训练108题:密码验证合格程序
- 华为机试---密码验证合格程序
- 华为机试-密码验证合格程序
- 【华为机试】密码验证合格程序
- Java - 华为机试训练 - 密码验证合格程序(正则表达式判断)
- 华为oj之密码验证合格程序
- 华为机试题:密码验证合格程序
- [华为机试练习题]31.密码验证合格程序
- 华为在线编程系列-密码合格验证
- 《华为机试在线训练》之简单密码
- 【华为oj】密码验证合格程序
- 华为OJ(密码验证合格程序)
- 华为oj 密码验证合格程序
- 华为OJ 密码验证合格程序
- 密码验证合格程序(华为oj)
- 【华为OJ】【017-密码验证合格程序】
- OpenCV学习笔记(二)——新版本模块结构
- 抽象类&接口
- 如何移除Chrome浏览器让人不爽的GoogleUpdate.exe后台更新进程
- Codeforces 86D Powerful Array 莫队
- 20. 远程端口查看
- 《华为机试在线训练》之密码验证合格程序
- brop
- mui aiax 与服务器后台数据交互
- Spring的BeanPostProcessor接口实现Demo
- IO操作之文件读写(一)
- mybaties+oracle:插入数据,返回自增长的id
- srop
- PE文件学习笔记(六):总结与PE解析器(PETool)实现
- 线程同步