分享

华为机试HJ20:密码验证合格程序

 翟天保的图书馆 2022-01-13

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

密码要求:

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;
}

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章