CS50P PS2 Vanity Plates:如何判定含中间字母的车牌无效
CS50P PS2 Vanity Plates 问题解决:识别中间含字母的无效车牌
你的核心问题出在循环逻辑的判断顺序和条件上——当前代码遇到第一个数字就直接return了,根本没机会检查后面是否出现字母;而且判断char.isalpha() and has_number的时机完全错误,因为当char.isdecimal()为真时,char.isalpha()必然为假,这个条件永远触发不了。
按照你的思路(出现数字后再出现字母则判定无效),重新梳理is_valid函数的逻辑:
- 先通过基础校验:长度2-6、全字母数字、开头两个是字母
- 遍历车牌的每个字符:
- 维护一个
has_number标记,记录是否已经出现过数字 - 当还没出现数字时:
- 遇到字母:跳过继续
- 遇到数字:如果是0直接返回无效;否则标记
has_number为True
- 当已经出现数字后:
- 遇到字母:直接返回无效(违反数字只能在末尾的规则)
- 遇到数字:跳过继续
- 维护一个
- 所有字符检查通过后返回有效
修正后的代码:
def main(): plate = input("Plate: ") print("Valid" if is_valid(plate) else "Invalid") def is_valid(s): # 基础校验:长度、全字母数字、开头两个是字母 if not (2 <= len(s) <= 6 and s.isalnum() and s[0].isalpha() and s[1].isalpha()): return False has_number = False for char in s: if not has_number: if char.isdecimal(): # 首个数字不能是0 if char == "0": return False has_number = True # 遇到字母则继续,无需处理 else: # 已经出现过数字,再遇到字母直接无效 if char.isalpha(): return False # 所有规则都满足 return True main()
关键修改说明:
- 简化了基础校验的嵌套逻辑,用一个
if not直接过滤不符合条件的情况,更清晰 - 初始化
has_number = False,遍历每个字符时动态更新状态 - 当
has_number为True后,只要遇到字母就立即返回False,完美覆盖FE43E2这类中间含字母的无效情况 - 移除了原代码中错误的提前return逻辑,确保每个字符都能被检查到
测试FE43E2时,遍历到第5个字符E时,has_number已经是True(因为前面有4、3),此时发现E是字母,直接返回False,输出Invalid,符合预期。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

