华为机试每日一练——第二题:密码验证合格程序

简介: 题目入口:密码验证合格程序

题目入口:密码验证合格程序


问题描述

密码要求:


1.长度超过8位


2.包括大小写字母.数字.其它符号,以上四种至少三种


3.不能有长度大于2的不含公共元素的子串重复 (注:其他符号不含空格或换行)


数据范围:输入的字符串长度满足 1≤n≤100


输入:


一组字符串。


输出:


如果符合要求输出:OK,否则输出NG


df8502513d46620a66cbd8dea032e9f8_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png


解题思路

       如常规的OJ一样,同样是while循环scanf接受。不过这次要接收字符串要用‘%s’。


       本题主要是判断输入字符串是否符合规则,        


下面,我会分别讲解符合规则的三个条件该怎么判断


1、长度超过8位

这个条件好解决,只需要用到strlen库函数即可得到字符串长度。


2、包括大小写字母.数字.其它符号,以上四种至少三种

因为要统计字符串里面字符的种类,所以我们要遍历每个字符串同时记录,但该如何记录呢?


如果我们定义一个变量,每次遍历到的字符在范围内就统计一次,最后再验证该边量是否等于四,这样可行吗?显然是不可行的,我们需要定义四个变量。


比如我们定义a、 b、 c 、d 四个变量并初始化为0,在遍历每个字符串时,添加下面的条件。


当循环字母满足(1)时就把a置为1(注意是置为1而不是++1)


当循环字母满足(2)时就把b置为1


当循环字母满足(3)时就把c置为1


当循环字母满足(4)时就把d置为1


当遍历结束,判断(a+b+c+d)的值,如果满足则进行下一个条件的检验


(1)'A' <= str[i] && str[i] <= 'Z'

             

(2)'1' <= str[i] && str[i] <= '9'

           

(3)'a' <= str[i] && str[i] <= 'w'

         

(4)其他


3、不能有长度大于2的不含公共元素的子串重复 (注:其他符号不含空格或换行)  

第三个条件也是这三个条件中最难的,我解释一个不能有长度大于2的不含公共元素的子串重复


如下图:


该字符串中有两个子串重复,分别是'AbcA',但是大家看我画的方格有重叠的部分'A',这种就叫‘含公共子串重复’。

7ba40cd5c515b8e16f0edbe4359bb77d_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png


题义理解清楚了,那我们该怎么找出重复子串呢?大家想一个如果用两个for循环嵌套然后用外层和内层元素一个一个相比较那太麻烦了,而且需要创建的变量太多不行。我们能不能再赋值一份该字符串,然后一个动一个不动,一个一个比较

6b60ab79a09a02ef9d57b83d974386de_2405a9fd57974a158f5c460228598f58.gif

我们把固定不动的字符串称为str,把动的字符串称为cmp


当str中第i个字符与cmp中第j的字符相同时,就把str中i+1和i+2和cmp中j+1和j+2中的字符分别比对


如果比对成功,则该字符串不符合条件

2137465e0053f2fd075f4f7d5c72c71c_e659b25c29f242419fe5ed7c4f8ece68.gif

最后,三个条件我们都分析完了,聪明的你肯定会发现,这三个条件判断难度是逐渐递增的。


       当字符串不满足条件1时,那条件2和条件3也不用判断了,所以我们把条件1放到if语句的最外成,把条件3放到if语句的最内层,这样就可以节省时间。


代码实现

#include<stdio.h>
#include<string.h>
int main()
{
    char str[100];
    while (scanf("%s",str)!=EOF)
    {
        int sz = strlen(str);
        if (sz <= 8)//第一个条件判断
        {
            printf("NG\n");
        }
        else {
            int a = 0, b = 0, c = 0, d = 0;
            for (int i = 0; i < sz; i++)
            {
                if ('A' <= str[i] && str[i] <= 'Z')
                {
                    a = 1;
                }
                else if ('1' <= str[i] && str[i] <= '9')
                {
                    b = 1;
                }
                else if ('a' <= str[i] && str[i] <= 'w')
                {
                    c = 1;
                }
                else {
                    d = 1;
                }
            }
            if (((a + b + c + d) < 3))//第二个条件判断
            {
                printf("NG\n");
            }
            else {
                //判断长度大于2的不含公共元素的子串重复
                char* cmp = (char*)malloc(sz * sizeof(char));
                int m = 0;
                strcpy(cmp, str);//把str中的字符复制给cmp
                for (int i = 0; i < sz - 3; i++)
                {
                    for (int j = i + 3; j < sz; j++)
                    {
                        if (str[i] == cmp[j] && str[i + 1] == cmp[j + 1] && str[i + 2] == cmp[j + 2])
                        {
                            m = 1;
                            break;
                        }
                    }
                }
                if (m == 1)//第三个条件判断
                {
                    printf("NG\n");
                }
                else {
                    printf("OK\n");
                }
            }
        }
    }



相关文章
|
1月前
|
安全 BI 数据安全/隐私保护
每天一道C语言编程:合格密码的判定
每天一道C语言编程:合格密码的判定
27 0
|
1月前
|
算法
算法编程(六):验证回文串
算法编程(六):验证回文串
30 0
|
7月前
|
Java
hdu1279 验证角谷猜想
hdu1279 验证角谷猜想
24 0
|
8月前
|
数据安全/隐私保护
华为机试HJ20:密码验证合格程序
华为机试HJ20:密码验证合格程序
|
8月前
|
SQL 安全 前端开发
新手学习渗透测试常规思路
2017黑客新手工具系列集合附链接 - 知乎专栏|这门技术(艺术)一开始也不是每个人都会的,正所谓没有人一出生就会走路,从不懂到入门到深谙,一步步慢慢来,每个人都是这样;但是在这个过程中, 思路无疑是最重要的,没有做不到只有想不到,就跟咱们高中解题时有了思路就迎刃而解一样,手里拿着铲子(技巧知识)但不是道从何挖起岂不是悲哀。
105 0
|
11月前
|
自然语言处理 测试技术 人机交互
软件测试 系统功能测试习题及答案
软件测试 系统功能测试习题及答案
562 0
|
11月前
|
数据采集 数据挖掘 Python
【每周一坑】验证哥德巴赫猜想
尽管对于大多数人来说,无法看懂哥德巴赫猜想及相关问题的证明。不过我们借助计算机,可以快速地判断一个数是否符合哥德巴赫猜想。(只需在判断质数的代码基础上加上两三行。)
|
算法 数据安全/隐私保护
密码验证合格程序(算法)
密码验证合格程序(算法)
|
安全 编译器 C++
还在纠结VS用scanf会被报错,一招设置轻松解决问题
vs2019使用scanf会产生的问题的解决方案之一
290 0
还在纠结VS用scanf会被报错,一招设置轻松解决问题
|
机器学习/深度学习 数据安全/隐私保护
420. 强密码检验器 : 分情况讨论模拟题
420. 强密码检验器 : 分情况讨论模拟题