题解 | #密码验证合格程序#

密码验证合格程序

https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841

对于一个密码验证格式,有3点要求:

  1. 密码长度大于8 --> 判断code的size
  2. 必须有大小写,数字,其他字符4种中的3种 --> 遍历,只要多出现一种类型就记录+1
  3. 判断是否有重复的长度大于2的公共子串

难点在于如何判断公共子串,使用双指针来判断:

主指针:遍历每个字符

副指针:在主指针后3个字符开始,查找有没有相同字符

若有,则开始判断3个长度的主、副子串是否相同。相同则存在,不相同,则移动主指针

若无,接着移动副指针

#include <cstring>
#include <iostream>
#include <string>
using namespace std;

bool find_substr(string code){
    int len = size(code);

    int ind_start = 0;
    while(ind_start < len-5){
        char indCheck = code[ind_start];
        int ind_sub_start = ind_start+3;
        while(ind_sub_start<len-2){
            if(code[ind_sub_start] != indCheck)
                ind_sub_start++;
            else{
                int lenCheck = 3;

                string strCheck = code.substr(ind_start, lenCheck);
                string strSub = code.substr(ind_sub_start, lenCheck);

                if(strCheck == strSub)
                    return true;
                else
                    break;
            }
        }
        ind_start ++;
    }
    return false;
}
bool judge(string code){
    int len = size(code);

    if(len < 8)
        return false;
    else{
        int count = 0;
        bool flag[4] = {false};
        for(int i = 0; i < len; i ++){
            if(code[i] >= '0' && code[i] <= '9')
                flag[0] = true;
            else if(code[i] >= 'A' && code[i] <= 'Z')
                flag[1] = true;
            else if(code[i] >= 'a' && code[i] <= 'z')
                flag[2] = true;
            else
                flag[3] = true;
        }
        for(int i = 0; i < 4; i ++){
            if(flag[i])
                count ++;
        }
        if(count < 3)
            return false;
        
        else{
            if(find_substr(code))
                return false;
            else
                return true;
        }
    }
}
int main() {
    string s;
    while(getline(cin, s)){
        if(judge(s))
            cout << "OK" << endl;
        else
            cout << "NG" << endl;
    }

}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

11-02 09:49
已编辑
货拉拉_测试(实习员工)
热爱生活的仰泳鲈鱼求你们别卷了:没事楼主,有反转查看图片
点赞 评论 收藏
分享
沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务