
题目考点
这道题主要考:
- 字符串遍历
- 条件判断
- 字符分类:大写字母、数字、字母数字字符
- 计数
- 去重判断:
set() - 多组输入处理
这类题本质上不是复杂算法题,而是“规则校验题”:给你一个字符串,让你判断它是否同时满足若干个条件。
审题
题目要求判断每个 UID 是否有效。
一个有效 UID 必须同时满足 5 个条件:
| 条件 | 含义 |
|---|---|
| 至少 2 个大写英文字母 | 比如 A、B、Z |
| 至少 3 个数字 | 比如 0 到 9 |
| 只能包含字母和数字 | 不能有 @、#、空格、下划线等 |
| 不能有重复字符 | 同一个字符不能出现两次 |
| 长度必须正好是 10 | 不能多,也不能少 |
注意:这些条件是“同时满足”。只要有一个条件不满足,就输出 Invalid。
思路提示
遇到这种“判断字符串是否符合规则”的题,可以按下面的顺序思考。
第一步,先看长度。如果长度不是 10,直接无效。
第二步,检查有没有非法字符。题目只允许:
a-z
A-Z
0-9
如果出现其他字符,比如 @、_、空格,就无效。
第三步,统计大写字母数量和数字数量。遍历字符串,每看到一个大写字母,就让大写计数加 1;每看到一个数字,就让数字计数加 1。
第四步,检查有没有重复字符。最简单的方法是使用 set()。因为 set 会自动去重,所以:
len(set(uid)) == len(uid)
说明没有重复字符。
第五步,把所有条件合在一起判断。
完整设计思路
我们可以写一个函数:
def is_valid(uid):
这个函数专门判断一个 UID 是否有效。
函数内部做 4 件事:
- 判断长度是不是 10。
- 判断是否有重复字符。
- 遍历 UID,检查每个字符是否合法。
- 统计大写字母数量和数字数量。
最后判断:
upper_count >= 2 and digit_count >= 3
如果满足,就返回 True,否则返回 False。
代码实现
下面使用最基础、最适合初学者理解的写法,不使用正则表达式。
def is_valid(uid):
# 条件 1:长度必须是 10
if len(uid) != 10:
return False
# 条件 2:不能有重复字符
if len(set(uid)) != len(uid):
return False
upper_count = 0
digit_count = 0
for ch in uid:
# 判断是否是大写字母
if 'A' <= ch <= 'Z':
upper_count += 1
# 判断是否是数字
elif '0' <= ch <= '9':
digit_count += 1
# 判断是否是小写字母
elif 'a' <= ch <= 'z':
pass
# 如果不是字母,也不是数字,就是非法字符
else:
return False
# 条件 3:至少 2 个大写字母
# 条件 4:至少 3 个数字
if upper_count >= 2 and digit_count >= 3:
return True
else:
return False
if __name__ == '__main__':
t = int(input().strip())
for _ in range(t):
uid = input().strip()
if is_valid(uid):
print("Valid")
else:
print("Invalid")
输入部分解释
题目给的输入格式是:
t = int(input().strip())
这行可以理解成:
读取第一行输入,把它转成整数,表示接下来有多少个 UID 要判断。
例如输入:
2
B1CD102354
B1CDEF2354
第一行 2 表示有 2 个测试用例。
所以后面要循环 2 次:
for _ in range(t):
uid = input().strip()
每次读取一个 UID,并判断它是 Valid 还是 Invalid。
运行演示
样例输入:
2
B1CD102354
B1CDEF2354
先看第一个:
B1CD102354
长度是 10,满足。
大写字母有:
B C D
一共 3 个,满足“至少 2 个大写字母”。
数字有:
1 1 0 2 3 5 4
数字数量满足,但是字符 1 出现了两次。
题目要求不能有重复字符,所以输出:
Invalid
再看第二个:
B1CDEF2354
长度是 10。
大写字母有:
B C D E F
至少 2 个,满足。
数字有:
1 2 3 5 4
至少 3 个,满足。
没有特殊符号,也没有重复字符。
所以输出:
Valid
最终输出:
Invalid
Valid
方法总结
这类题的核心思路是:不要一开始就急着写代码,而是先把规则拆开。
以后看到类似题目,可以按这个模板思考:
1. 字符串长度是否合法?
2. 字符类型是否合法?
3. 某类字符数量是否达标?
4. 是否存在重复?
5. 所有条件是否同时满足?
在代码上,通常有两种写法:
一种是逐条 if 判断,不满足就 return False。这种写法最适合初学者。
另一种是用正则表达式一次性判断,但不适合刚开始学习时直接使用,因为容易看不懂。
小练习
请你尝试完成下面这个变形题。
给定一个密码字符串,判断它是否有效。
有效密码必须满足:
- 长度至少为 8。
- 至少包含 1 个大写字母。
- 至少包含 1 个小写字母。
- 至少包含 1 个数字。
- 不能包含空格。
输入:
Abc12345
输出:
Valid
提示:可以仿照本题,遍历字符串,然后分别统计大写字母、小写字母和数字的数量。



