本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目来自牛客网的华为机试题库,本题目为中等题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.按照函数的判断结果进行输出,即得到想要的结果。