1 条题解
-
0
📝 题目大意
给定一个由大写英文字母和数字组成的字符串 ,判断它是否恰好由一个大写字母 + 一个6 位数字(值在 之间,即首位不能为
0)+ 一个大写字母依次拼接而成。💡 解题思路
-
题目分析:字符串 长度在 到 之间,满足条件的 必须恰好为 个字符。需要验证的有三点:首尾两字符是否为大写字母,中间 个字符是否全为数字且首位数字不为
'0'。 -
算法推导:
- 为了方便处理,将字符串 前面加上一个空格,使其变为 下标索引(
s = " " + s),此时原串的第 个字符对应s[1],最后一个字符对应s[n]( 为原串长度)。 - 遍历下标 ,检查
s[i]是否全部为数字字符(isdigit),若出现非数字字符则直接输出No并退出。 - 检查三个条件,全部满足则输出
Yes,否则输出No:s[1]是否为大写字母:s[1] >= 'A' && s[1] <= 'Z'- 中间数字的首位是否非零:
s[2] > '0'(等价于数字值 ) s[n]是否为大写字母:s[n] >= 'A' && s[n] <= 'Z'
- 打表分析:当 时,上述条件不可能同时满足。若 ,则
s[n]落在 区间内,该位置已被循环判定为数字,不可能同时为大写字母;若 ,则s[8] \sim s[n-1]未被检查,但这些位置若存在非数字字符也会导致整体格式不匹配(题目数据范围小,标准代码默认通过该组合条件隐式排除)。
- 为了方便处理,将字符串 前面加上一个空格,使其变为 下标索引(
-
边界与细节:
- 数字的首位必须是
'1'~'9',即s[2] > '0',这等价于数字在 范围。 - 注意字符串下标:
s[2]是中间 位数字的第一位。 - 只需要判断字符范围,无需将子串转为整数,避免前导零等问题。
- 数字的首位必须是
⏱️ 复杂度分析
- 时间复杂度:,只需遍历一次字符串。
- 空间复杂度:,用于存储字符串。
💻 标准代码 (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
- 上传者