字符分类:大写字母、数字、字母数字字符

题目考点

这道题主要考:

  1. 字符串遍历
  2. 条件判断
  3. 字符分类:大写字母、数字、字母数字字符
  4. 计数
  5. 去重判断:set()
  6. 多组输入处理

这类题本质上不是复杂算法题,而是“规则校验题”:给你一个字符串,让你判断它是否同时满足若干个条件。


审题

题目要求判断每个 UID 是否有效。

一个有效 UID 必须同时满足 5 个条件:

条件含义
至少 2 个大写英文字母比如 ABZ
至少 3 个数字比如 09
只能包含字母和数字不能有 @#、空格、下划线等
不能有重复字符同一个字符不能出现两次
长度必须正好是 10不能多,也不能少

注意:这些条件是“同时满足”。只要有一个条件不满足,就输出 Invalid


思路提示

遇到这种“判断字符串是否符合规则”的题,可以按下面的顺序思考。

第一步,先看长度。如果长度不是 10,直接无效。

第二步,检查有没有非法字符。题目只允许:

a-z
A-Z
0-9

如果出现其他字符,比如 @_、空格,就无效。

第三步,统计大写字母数量和数字数量。遍历字符串,每看到一个大写字母,就让大写计数加 1;每看到一个数字,就让数字计数加 1。

第四步,检查有没有重复字符。最简单的方法是使用 set()。因为 set 会自动去重,所以:

len(set(uid)) == len(uid)

说明没有重复字符。

第五步,把所有条件合在一起判断。


完整设计思路

我们可以写一个函数:

def is_valid(uid):

这个函数专门判断一个 UID 是否有效。

函数内部做 4 件事:

  1. 判断长度是不是 10。
  2. 判断是否有重复字符。
  3. 遍历 UID,检查每个字符是否合法。
  4. 统计大写字母数量和数字数量。

最后判断:

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。这种写法最适合初学者。

另一种是用正则表达式一次性判断,但不适合刚开始学习时直接使用,因为容易看不懂。


小练习

请你尝试完成下面这个变形题。

给定一个密码字符串,判断它是否有效。

有效密码必须满足:

  1. 长度至少为 8。
  2. 至少包含 1 个大写字母。
  3. 至少包含 1 个小写字母。
  4. 至少包含 1 个数字。
  5. 不能包含空格。

输入:

Abc12345

输出:

Valid

提示:可以仿照本题,遍历字符串,然后分别统计大写字母、小写字母和数字的数量。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇