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

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

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


问题描述

密码要求:


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



相关文章
|
6月前
|
存储 安全 Linux
CTFHuB靶场命令执行题型过关总结
本篇博文是对自己学习rce漏洞后,因为没有进行实战练习,仅仅停留在概念上,因此做了一次靶场实战练习,来帮助自己熟悉rce漏洞的利用类型以及利用方法,写下这篇文章对此做个总结..其实关于这个练习已经过去了很久了,但我还是要那出来进行一次复习吧,对与命令执行相关的一些操作,对自己在漏洞挖掘方面能有更多的帮助,通过这次练习也对自己关于代码审计或是关于linux命令的常见命令的同意替换有了更多的了解.
|
6月前
|
安全 BI 数据安全/隐私保护
每天一道C语言编程:合格密码的判定
每天一道C语言编程:合格密码的判定
44 0
|
6月前
|
数据安全/隐私保护
HJ20 密码验证合格程序
HJ20 密码验证合格程序
45 0
|
数据安全/隐私保护
华为机试HJ20:密码验证合格程序
华为机试HJ20:密码验证合格程序
|
机器学习/深度学习 数据安全/隐私保护
(leecode)密码检查
小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求: 1. 密码只能由大写字母,小写字母,数字构成; 2. 密码不能以数字开头; 3. 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种; 4. 密码长度至少为8
72 0
(leecode)密码检查
|
自然语言处理 测试技术 人机交互
软件测试 系统功能测试习题及答案
软件测试 系统功能测试习题及答案
610 0
|
数据采集 数据挖掘 Python
【每周一坑】验证哥德巴赫猜想
尽管对于大多数人来说,无法看懂哥德巴赫猜想及相关问题的证明。不过我们借助计算机,可以快速地判断一个数是否符合哥德巴赫猜想。(只需在判断质数的代码基础上加上两三行。)
|
数据安全/隐私保护
牛客网OR141 密码检查——“C”
牛客网OR141 密码检查——“C”
|
数据安全/隐私保护 C++
C/C++编程题之密码验证合格程序
C/C++编程题之密码验证合格程序
LeetCode每日一题——929. 独特的电子邮件地址
每个 有效电子邮件地址 都由一个 本地名 和一个 域名 组成,以 ‘@’ 符号分隔。除小写字母之外,电子邮件地址还可以含有一个或多个 ‘.’ 或 ‘+’ 。
108 0