题解 | 密码验证合格程序

密码验证合格程序

https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841

2025.3.27的版本,笨比题目写错,测试案例也写错

合格的密码要求:

- 长度超过 8 位∙ 

- 必须包含大写字母、小写字母、数字、特殊字符中的至少三种∙ 

- 不能分割出两个独立的、长度大于 22 的连续子串,使得这两个子串完全相同;更具体地,如果存在两个长度大于 22 的独立子串 s1,s2s1​,s2​ ,使得 s1=s2s1​=s2​ ,那么密码不合法。

测试案例:

输入:

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
021Abc1111

输出:(第五个是NG,111重复)

OK
NG
NG
OK
NG

输入:

Abc1@
A1@ababa@1A

输出:(第二个aba重复)

NG
NG
import sys

"""
如何找到一个字符串的所有长度大于2的子字符串
"""
# secret = sys.stdin.read().strip().split("\n")
secret = []
for _ in sys.stdin:
    _ = _.strip()
    if not _:  # 如果输入空行终止
        break
    secret.append(_)
# print(secret)

# 遍历所有密码判断
for i in range(len(secret)):

    # 检查长度
    if len(secret[i]) < 8:
        print("NG")  # 如果连长度都不满足,直接NG
        continue
        # 遍历每一个密码内部
    type = [0, 0, 0, 0]  # 记录字符种类
    secret_mini = []  # 列表存储子字符串
    back = 0  # 如果子字符串重复,为1
    for j in range(len(secret[i])):
        str1 = str(secret[i])
        # 检查子字符串是否重复
        if back == 1:
            break
        # 如果是大写字母
        if 65 <= ord(str1[j]) <= 90:
            if type[0] == 0:
                type[0] += 1

        # 如果是小写字母
        elif 97 <= ord(str1[j]) <= 122:
            if type[1] == 0:
                type[1] += 1
        # 如果是数字
        elif 48 <= ord(str1[j]) <= 57:
            if type[2] == 0:
                type[2] += 1
        # 如果是特殊字符
        elif (
            33 <= ord(str1[j]) <= 46
            or 58 <= ord(str1[j]) <= 64
            or 91 <= ord(str1[j]) <= 96
            or 123 <= ord(str1[j]) <= 126
        ):
            if type[3] == 0:
                type[3] += 1
        # 如果都不是
        else:
            print("NG")
            break  # 异常不合格此密码直接NG

        # 找到字符串长度大于2的所有子串
        for t in range(j + 3, len(secret[i]) + 1):
            if t > len(secret[i]) + 1:
                break
            str2 = str1[j:t]
            if str2 not in secret_mini:
                secret_mini.append(str2)
            # 如果存在,说明重复
            else:
                print("NG")
                back = 1

                break
    # 检查字符种类
    if len(secret[i]) > 8 and back == 0:
        sum_type = 0
        for x in range(4):
            sum_type += type[x]
        if sum_type < 3:
            print("NG")  # 种类没有三种直接NG
            continue
        else:
            print("OK")  # 长度、种类、重复子串都合格

核心知识10:查找字符串长度大于2的所有子字符串+未知行数输入读取

字符串查找

def find_substrings(s):
    substrings = []
    n = len(s)
    for i in range(n):
        for j in range(i+3, n+1):  # j至少比i大3,保证长度>2
            substrings.append(s[i:j])
    return substrings

未知行数输入读取

使用这行代码可以读取所有的输入,但在本地编译器运行的时候,一直输入不终止,无法结束输入 sys.stdin.read().strip().split("\n")

原因分析:

在线代码平台(牛客网)输入方法可能使用的是命令行定向输入

python your_script.py < input.txt

解决办法:

import sys

lines = []
for line in sys.stdin:
    line = line.strip()
    if not line:  # 空行时终止输入
        break
    lines.append(line)

# print(lines)
全部评论

相关推荐

程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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