华为机试HJ20:密码验证合格程序
Posted 翟天保Steven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试HJ20:密码验证合格程序相关的知识,希望对你有一定的参考价值。
题目描述:
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度大于2的子串重复
输入描述:
一组或多组长度超过2的字符串。每组占一行
输出描述:
如果符合要求输出:OK,否则输出NG
示例:
输入:021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000
输出:OK NG NG OK
解题思路:
首先判断输入的密码长度是否大于等于8 ,满足条件1;再分别统计大写小写数字以及其他字符出现的个数,若某类字符出现次数不为0则让flag加一,flag大于等于3则满足条件2;因为不能有相同长度大于2的子串重复,也就是密码中任意3个字符的组合不能再出现第二次,那么可以从密码起点开始遍历,提取以某点为起点的三个字符组成一个新的子字符串,再从这个点后面的点开始查找有没有一样的字符串,若没找到则满足条件3。
测试代码:
#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;
int main()
{
vector<string> input;
vector<string> result;
string in;
while(cin>>in)
{
int lower=0;
int upper=0;
int number=0;
int other=0;
int flag=0;
if(in.size()<=8)
{
result.push_back("NG");
continue;
}
for(int i=0;i<in.size();++i)
{
if(in[i]>=65&in[i]<=90)
upper++;
else if(in[i]>=97&in[i]<=122)
lower++;
else if(in[i]>=48&in[i]<=57)
number++;
else
other++;
}
if(lower!=0)flag++;
if(upper!=0)flag++;
if(number!=0)flag++;
if(other!=0)flag++;
if(flag<3)
{
result.push_back("NG");
continue;
}
bool isfind=false;
for(int i=0;i<in.size()-2;++i)
{
string temp=in.substr(i,3);
if(in.find(temp,i+3)!=in.npos)
{
isfind=true;
break;
}
}
if(isfind)
{
result.push_back("NG");
continue;
}
result.push_back("OK");
}
for(auto i:result)
{
cout<<i<<endl;
}
return 0;
}
以上是关于华为机试HJ20:密码验证合格程序的主要内容,如果未能解决你的问题,请参考以下文章