【华为笔试-3】HJ20 密码验证合格程序
HJ20 密码验证程序
输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
输出:
OK
NG
NG
OK
注:输入结束后有中止结束标志EOF【这个原题给的时候无说明,自己跑他的用例和看论坛看出来的】
-
题解:
要点有三个,分别是:长度超过八位、包含三种以上、和公共子字符串,以及输入输出
- 输入输出:以为如果知道了他有EOF终止输入的话,可以使用
sys.stdin.read
或者使用while
+try
的方式,我是用的后者,方便调试。 - 长度超过八位就不解释了
- 至少三种以上:遍历每个字符,如果出现了大、小写、数字、字符、那么出现的情况就记为1,无则0.最后统计满足情况
- 公共子序列:
- 遍历密码获得长度为3的子序列【如果不存在则append,否则直接退出】(因为不能大于2,就是最少是3个)
- 输入输出:以为如果知道了他有EOF终止输入的话,可以使用
-
难度:
- 如果题目告诉了有EOF的情况下挺简单,没解释清楚有EOF我也不会获取不定长输入
-
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