牛客网学习笔记(HJ20 密码验证合格程序)

305 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目来自牛客网的华为机试题库,本题目为中等题HJ20 密码验证合格程序

HJ20 密码验证合格程序

描述

密码要求:

1.长度超过8位

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

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

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

输入描述:

一组字符串。

输出描述:

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

示例1

输入:

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000

输出:

OK
NG
NG
OK

代码

def check(s):
    if len(s) <= 8:
        return 0
    la =lA = l1 = l_ = 0
    for i in range(len(s)):
        if 'a' <= s[i] <= 'z':
            la = 1
        elif 'A' <= s[i] <= 'Z':
            lA = 1
        elif '0' <= s[i] <= '9':
            l1 = 1
        else:
            l_ = 1
    if la + lA + l1 + l_ < 3:
        return 0
    for i in range(len(s)-3):
        a = list(s.split(s[i:i+3]))
        if len(a) >= 3:
            return 0
    return 1

while True:
    try:
        s = input()
        if check(s) == 0:
            print('NG')
        else:
            print('OK')
    except:
        break

解析

因为是多次读入然后判断,又不知道一共需要读入几个,所以又到了我不会读入数据的时候了......用到了while True+try控制读入。密码的要求也比较简单,长度大于8和有至少3种字符是很容易判断的,我觉得比较难的还是不能有长度大于2的包含公共元素的子串重复。我也是用的很笨的方法来写的,挨个用长度为2的字符串去分割整个密码如果分成了大于等于3段,就说明有两个一样的分割字符。虽然看起来很笨但是没超时。

具体方法: 1.定义一个按上述方法判断密码的函数
2.用while+try+except对数据进行读入
3.按照函数的判断结果进行输出,即得到想要的结果。