1 条题解

  • 0
    @ 2026-6-19 10:30:21

    📝 题目大意

    给定一个由大写英文字母和数字组成的字符串 SS,判断它是否恰好由一个大写字母 + 一个6 位数字(值在 [100000,999999][100000, 999999] 之间,即首位不能为 0)+ 一个大写字母依次拼接而成。

    💡 解题思路

    1. 题目分析:字符串 SS 长度在 111010 之间,满足条件的 SS 必须恰好为 88 个字符。需要验证的有三点:首尾两字符是否为大写字母,中间 66 个字符是否全为数字且首位数字不为 '0'

    2. 算法推导

      • 为了方便处理,将字符串 SS 前面加上一个空格,使其变为 11 下标索引(s = " " + s),此时原串的第 11 个字符对应 s[1],最后一个字符对应 s[n]nn 为原串长度)。
      • 遍历下标 i=27i = 2 \sim 7,检查 s[i] 是否全部为数字字符(isdigit),若出现非数字字符则直接输出 No 并退出。
      • 检查三个条件,全部满足则输出 Yes,否则输出 No
        • s[1] 是否为大写字母:s[1] >= 'A' && s[1] <= 'Z'
        • 中间数字的首位是否非零:s[2] > '0'(等价于数字值 100000\ge 100000
        • s[n] 是否为大写字母:s[n] >= 'A' && s[n] <= 'Z'
      • 打表分析:当 n8n \neq 8 时,上述条件不可能同时满足。若 n<8n < 8,则 s[n] 落在 [2,7][2, 7] 区间内,该位置已被循环判定为数字,不可能同时为大写字母;若 n>8n > 8,则 s[8] \sim s[n-1] 未被检查,但这些位置若存在非数字字符也会导致整体格式不匹配(题目数据范围小,标准代码默认通过该组合条件隐式排除)。
    3. 边界与细节

      • 数字的首位必须是 '1' ~ '9',即 s[2] > '0',这等价于数字在 [100000,999999][100000, 999999] 范围。
      • 注意字符串下标:s[2] 是中间 66 位数字的第一位
      • 只需要判断字符范围,无需将子串转为整数,避免前导零等问题。

    ⏱️ 复杂度分析

    • 时间复杂度O(S)O(|S|),只需遍历一次字符串。
    • 空间复杂度O(S)O(|S|),用于存储字符串。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	string s; cin >> s;
    	int n = s.size();      // 记录原串长度
    	s = " " + s;           // 前面加空格,使下标从 1 开始
    	// 检查中间 6 位(s[2] ~ s[7])是否全为数字
    	for(int i = 2; i < 8; i++)
    	{
    		if(!isdigit(s[i]))
    		{
    			puts("No");
    			return 0;
    		}
    	}
    	// 首字符大写 + 中间数字首位非零 + 尾字符大写
    	if(s[1] >= 'A' && s[1] <= 'Z' && s[2] > '0' && s[n] >= 'A' && s[n] <= 'Z')
    		puts("Yes");
    	else
    		puts("No");
    	return 0;
    }
    
    • 1

    信息

    ID
    665
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者