华为在线笔试——密码验证合格程序

密码要求:

1.长度超过8位

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

3.不能有相同长度超2的子串重复

 

说明:长度超过2的子串


输入描述:

 
 

一组或多组长度超过2的子符串。每组占一行

输出描述:

 
 

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

示例1

输入

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000

输出

OK
NG
NG
OK

这道题拿到手后一看思路很简单,只要满足那三个条件即可,但是真正做起来的时候却发现没有那么容易,所以有一些题目容易看起来简单做起来的时候还真是有点问题的!

1.第一个条件比较好做len=strlen(s);即可知道字符串长度,从而看下程度是否满足,如果不满足后面的直接不用算了。

2.第二个也还可以,但是遇到了一个小小的问题,我们要清楚的是只要包含有大写,小写,数字或者其他字符的3种就可以,这个时候我犯了一个错误就是,遇到一个就+1,这样导致可能只有两种字符也满足,所以为了解决这个问题,可以用之前的一个小技巧就是数组,设一个数组temp[4],分别大写,小写,数字,其他分别对应temp[0],temp[1],temp[2],temp[3],如果出现对应的字符只需要对应的数组位置加1即可,最后统计temp非0的个数;另外一个就是只要有对应的upper,lower,num,other就=1;最后加起来大于3即可。

3.最困扰我的是第三个条件,在字符串中查找子字符串,思路有但是c语言毕竟不像其他语言一样有很多的函数供我们使用,最开始是想将每3个字符放在新的一个字符串数组中,在总的字符串中查找新的字符串,但是没行的通;后面参考了一下别人的想法,两个for循环解决问题,及判断每3个字符是否对应相等,这里要注意for循环的结束条件。

-----------------------------------一下附上我的代码,简单易懂哦--------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char s[100];
    
    while( gets(s) )
    {   int flag=0;
     //第一个条件判断不满足直接后面的就不用判断了
        int len=strlen(s);
        if(len<=8)
           { printf("NG\n");flag=1;continue;}


     //第二个条件判断,不满足则退出
        int count=0,num=0,low=0,upper=0,other=0;
        for(int i=0;i<len;i++)
        {
            if(s[i]>='0'&&s[i]<='9')
                num=1;
            else if(s[i]>='A'&&s[i]<='Z')
                low=1;
            else if(s[i]>='a'&&s[i]<='z')
                upper=1;
            else
                other=1;
        }
        count=num+low+upper+other;
        if(count<3)
           { printf("NG\n");flag=1;continue;}


     //第三个条件判断
        for(int i=0;i<=len-3;i++)
            for(int k=i+3;k<len;k++)
            {
                if(s[i]==s[k]&&s[i+1]==s[k+1]&&s[i+2]==s[k+2])
                   { printf("NG\n");flag=1;continue;}
            }


     //如果flag==0表示满足3个条件,所以输出ok
            if(flag==0)
                printf("OK\n");
    }
        return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37241117/article/details/80388689