【华为笔试-3】HJ20 密码验证合格程序

HJ20 密码验证程序

image-20241106114740526

输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
输出:
OK
NG
NG
OK

注:输入结束后有中止结束标志EOF【这个原题给的时候无说明,自己跑他的用例和看论坛看出来的】

  1. 题解:

    要点有三个,分别是:长度超过八位、包含三种以上、和公共子字符串,以及输入输出

    • 输入输出:以为如果知道了他有EOF终止输入的话,可以使用 sys.stdin.read或者使用while+ try的方式,我是用的后者,方便调试。
    • 长度超过八位就不解释了
    • 至少三种以上:遍历每个字符,如果出现了大、小写、数字、字符、那么出现的情况就记为1,无则0.最后统计满足情况
    • 公共子序列:
      1. 遍历密码获得长度为3的子序列【如果不存在则append,否则直接退出】(因为不能大于2,就是最少是3个)
  2. 难度:

    • 如果题目告诉了有EOF的情况下挺简单,没解释清楚有EOF我也不会获取不定长输入
  3. code:

    """
    021Abc9000
    021Abc9Abc1
    021ABC9000
    021$bc9000
    OK
    NG
    NG
    OK
    """
    dig,low,up,pun = 0,1,2,3
    OK = "OK"
    NotOk = "NG"
    import string
    def judge_whether_lawful(input_str:str)->str:
    strs = [one_char for one_char in input_str]
    ok_count_list = [0,0,0,0] #4 situation
    ok_count = 0
    if len(strs) < 8:
    return NotOk
    for idx in range(len(strs)):
    if strs[idx] in string.digits:
    ok_count_list[dig] = 1
    elif strs[idx] in string.ascii_lowercase:
    ok_count_list[low] = 1
    elif strs[idx] in string.ascii_uppercase:
    ok_count_list[up] = 1
    elif strs[idx] in string.punctuation:
    ok_count_list[pun] = 1
    ok_count = sum(ok_count_list)
    public_list = []
    for idx in range(2,len(strs)):
    get_public = input_str[idx-2:idx] + input_str[idx]
    if get_public in public_list:
    return NotOk
    else:
    public_list.append(input_str[idx-2:idx]+input_str[idx])
    if ok_count >= 3:
    return OK
    else:
    return NotOk
    if __name__ == '__main__':
    input_list = []
    while True:
    try:
    temp_input = input()
    print(judge_whether_lawful(temp_input))
    except:
    break
posted @   io_T_T  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示