You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50P PS2 Vanity Plates:如何判定含中间字母的车牌无效

CS50P PS2 Vanity Plates 问题解决:识别中间含字母的无效车牌

你的核心问题出在循环逻辑的判断顺序和条件上——当前代码遇到第一个数字就直接return了,根本没机会检查后面是否出现字母;而且判断char.isalpha() and has_number的时机完全错误,因为当char.isdecimal()为真时,char.isalpha()必然为假,这个条件永远触发不了。

按照你的思路(出现数字后再出现字母则判定无效),重新梳理is_valid函数的逻辑:

  1. 先通过基础校验:长度2-6、全字母数字、开头两个是字母
  2. 遍历车牌的每个字符:
    • 维护一个has_number标记,记录是否已经出现过数字
    • 当还没出现数字时:
      • 遇到字母:跳过继续
      • 遇到数字:如果是0直接返回无效;否则标记has_number为True
    • 当已经出现数字后:
      • 遇到字母:直接返回无效(违反数字只能在末尾的规则)
      • 遇到数字:跳过继续
  3. 所有字符检查通过后返回有效

修正后的代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:55:19