华为机试在线训练_密码验证合格程序(字符串+数组)

密码验证合格程序

http://www.nowcoder.com/questionTerminal/184edec193864f0985ad2684fbc86841

/*
本文系「人工智能安全」(微信公众号)原创,转载请联系本文作者(同博客作者)。
欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。
我是一名有诗人气质的网络安全工程师
期待与你的思想交流碰撞出智慧的花火
水木清华
2002-03-15
密码验证合格程序
*/
#include<iostream>
using namespace std;
//密码合格验证的函数接口
string Password_Verification(string str)
{
    int len = str.size(); //获取字符串长度
    int a[4] = {0}; //初始化一个数组,用 0 1 记录每一种类型字符出现与否的情况
    int count = 0; //计数器,记录字符串包含多少种字符(大小写字母,数字,其他符号等)
    int num = 0; //有相同长度超 2 的子串重复的字符串对数
    //记录字符串是否包含四种字符的情况
    for (int i = 0; i < len; i++)
    {
        if ((str[i] >= 'A') && (str[i] <= 'Z'))
        {
            a[0] = 1;
        }
        else if ((str[i] >= 'a') && (str[i] <= 'z'))
        {
            a[1] = 1;
        }
        else if ((str[i] >= '0') && (str[i] <= '9'))
        {
            a[2] = 1;
        }
        else
        {
            a[3] = 1;
        }
    }
    //计算字符串包含的字符种类总数
    for (int i = 0; i < 4; i++)
    {
        if (a[i] == 1)
        {
            count++;
        }
    }
    //判断字符串是否包含长度超 2 的两个以上相同子串,故考虑长度为 3 的子字符串是否有重复即可,从而子字符串有(len - 2)种可能,但作为基准子字符串的只需要(len - 3)个即可
    //因为最后一个子字符串被反复判断的次数最多,并且在它之后没有可以比较的子字符串了,所以 i <= len - 6,即最后一个基准子字符串是倒数第二个子字符串
    for (int i = 0; i <= len - 6; i++)
    {
        for (int j = i + 3; j <= len - 3; j++)
        {
            if ((str[i] == str[j]) && (str[i + 1] == str[j + 1]) && (str[i + 2] == str[j + 2]))
            {
                num++;
            }
            //一旦出现重复的子字符串(长度为 3 ),就及时跳出 for 循环,避免做无用功
            if (num != 0)
            {
                break;
            }
        }
        //一旦出现重复的子字符串(长度为 3 ),就及时跳出 for 循环,避免做无用功
        if (num != 0)
        {
            break;
        }
    }
    //验证密码是否合格,并输出验证结果
    if ((len >= 9) && (count >= 3) && (num == 0))
    {
        return "OK";
    }
    //验证不通过的条件也可以放在不同位置,比如先判断字符串的长度是否超过 8,若不满足,其他条件也就不用验证了。
    else if ((len <= 8) || (count <= 2) || (num >= 1))
    {
        return "NG";
    }
}
//主函数
int main()
{
    string str;
    while (getline(cin,str))
    {
        cout << Password_Verification(str) << endl;
    }
    return 0;
}
大厂面试 文章被收录于专栏

分享有用的面试经历,倾吐有心的面试感悟,讲述有趣的面试故事,以飨读者。 常用语言是C++,编程力求规范整洁,题解清晰完整,像写诗一样去写代码。 本专栏文章系「人工智能安全」(微信公众号)原创,转载请联系本文作者。 欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。 我是一名有诗人气质的网络安全工程师,期待与你的思想交流碰撞出智慧的花火。

全部评论
请问 原题是指不能有相同长度大于等于2的子串重复。 应该包含长度为2的子串,例如 ab1ab。
1 回复 分享
发布于 2020-07-03 22:47
line78后面加一行return 0
1 回复 分享
发布于 2022-06-13 12:01
这个是暴力解法啊
1 回复 分享
发布于 2021-11-27 15:46
我把中间判断是否有相同字符串那里改写了一下通过了 for (int i = 0; i <= len - 4; i++) { for (int j = i + 1; j < len - 3; j++) {
点赞 回复 分享
发布于 2023-03-31 14:12 陕西
输入 aaaa123Abdc 按照题目要求,应该输出NG吧。但是这个程序输出是OK。我是不是理解错题目了?
点赞 回复 分享
发布于 2022-05-03 15:27
请问为什么会出现non-void function does not return a value in all control paths [-Werror,-Wreturn-type]这样的错误
点赞 回复 分享
发布于 2021-02-20 21:29

相关推荐

评论
47
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务