第15届蓝桥杯省赛Python研究生组-C设置密码

张开发
2026/4/16 10:44:38 15 分钟阅读

分享文章

第15届蓝桥杯省赛Python研究生组-C设置密码
考点类型循环判断题目描述题解逻辑1. 输入# 1. 一次性读取所有输入 lines sys.stdin.read().splitlines() T int(lines[0])splitlines()按换行符切分成列表是处理大数据输入的标准优化手段2. 预定义特殊字符# 2. 预定义合法特殊字符集合 special_chars {~, !, , #, $, %, ^, , *, (, ), _}采用集合而不是列表判断字符是否在集合里的时间复杂度是O(1)而列表是O(n)3. 循环处理每个密码for i in range(1, T 1): s lines[i] # 初始化状态标记 has_upper False has_lower False has_digit False has_special False # 特殊字符集合统计特殊字符种类 special_set set() # 合法性标记 is_valid True4. 字符检查与统计核心for c in s: if c.isupper(): has_upper True elif c.islower(): has_lower True elif c.isdigit(): has_digit True elif c in special_chars: has_special True special_set.add(c) # 加入集合自动去重 else: # 发现非法字符 is_valid False break # 直接跳出不用看后面的字符了内置方法方法作用c.isupper()是否大写字母c.islower()是否小写字母c.isalpha()是否纯字母c.isdigit()是否数字字符c.isalnum()是否字母或数字5. 合法性判定length len(s) if not is_valid or length 6: results.append(0) continue6. 统计各类型数量type_count sum([has_upper, has_lower, has_digit, has_special]) special_count len(special_set)7. 强度分级# 判断强密码 if length 12 and (type_count 4 or (type_count 3 and special_count 3)): results.append(3) else: # 判断中密码 if length 8 and type_count 2: results.append(2) # 剩余情况都是弱密码已保证长度≥6 else: results.append(1)参考代码import sys def main(): # 一次性读取所有输入避免逐行读取的性能问题 # splitlines()按换行符切分成列表 lines sys.stdin.read().splitlines() T int(lines[0]) # 预定义合法特殊字符集合用于快速判断 # 判断字符是否在集合里的时间复杂度是O(1),而列表是O(n) special_chars {~, !, , #, $, %, ^, , *, (, ), _} # 存放密码的判定结果 results [] for i in range(1, T 1): s lines[i] has_upper False has_lower False has_digit False has_special False # 特殊字符集合统计特殊字符种类 special_set set() # 合法性标记 is_valid True # 单次遍历完成所有字符检查和统计 for c in s: if c.isupper(): has_upper True elif c.islower(): has_lower True elif c.isdigit(): has_digit True elif c in special_chars: has_special True special_set.add(c) else: # 发现非法字符直接标记并终止遍历 is_valid False break length len(s) if not is_valid or length 6: results.append(0) continue # 统计字符类型总数 type_count sum([has_upper, has_lower, has_digit, has_special]) special_count len(special_set) # 判断强密码 if length 12 and (type_count 4 or (type_count 3 and special_count 3)): results.append(3) else: # 判断中密码 if length 8 and type_count 2: results.append(2) # 剩余情况都是弱密码已保证长度≥6 else: results.append(1) # 一次性输出所有结果避免多次print的性能开销 print(\n.join(map(str, results))) if __name__ __main__: main()

更多文章