【华为笔试-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 @ 2024-11-06 11:58  io_T_T  阅读(18)  评论(0编辑  收藏  举报