PAT 乙级题目讲解:1014《福尔摩斯的约会》

PAT 乙级题目讲解:1014《福尔摩斯的约会》
✅ PAT 乙级题目讲解1014《福尔摩斯的约会》摘要本文详解 PAT 乙级 1014 题《福尔摩斯的约会》。题目要求从四行乱码字符串中根据特定字符匹配规则解码出星期、小时和分钟。文章从题目分析、样例推演入手逐步拆解五大解题步骤并给出完整 C 代码实现与常见错误避坑指南适合 PAT 备考与字符串处理入门练习。 题目简介福尔摩斯收到一张奇怪的字条写着乱码一般的四行字符。作为一名侦探他很快发现这些乱码其实是一次约会的时间信息。我们的任务是根据字符间的相同规则解码出正确的星期、小时和分钟。规则如下星期前两个字符串中第一个相同的大写字母第几个字母就表示星期几小时前两个字符串中第一个相同的大写字母后出现的第一对相同字符用0~9表示 0 ~ 9 点A~N表示 10 ~ 23 点分钟后面两字符串第 1 对相同的英文字母出现的位置下标从 0 开始计。 样例分析输入示例3485djDkxh4hhGE 2984akDfkkkkggEdsb shgsfdk dHyscvnm分析过程前两个字符串中第一个相同的大写字母是D表示星期四THU前两个字符串中紧接着第二个相同的字符是E表示 14 点后面两字符串第一对相同的英文字母是s在索引 4从 0 开始计表示第 4 分钟。输出结果为THU 14:04 解题思路 变量说明变量名含义a, b前两行字符串用于确定星期和小时c, d后两行字符串用于确定分钟day表示星期几1~7通过字符 ‘A’~‘G’ 映射h小时m分钟w存储星期字符串的数组下标对应 day 值✅ Step 1读入输入字符串使用cin读取 4 行字符串分别赋值给变量a, b, c, d。cinabcd;✅ Step 2匹配星期几前两行字符串第一个相同的大写字母从左往右遍历a和b找到第一对相同的大写英文字母范围A~G转换为星期几。for(i0;ia.size();i){if(a[i]b[i](a[i]Aa[i]G)){daya[i]-A1;break;}}✅ Step 3匹配小时前两行字符串从上一步的下一个字符开始从上一次匹配的位置继续找第二对相同的字符要求字符为0~9表示 0 ~ 9 点A~N表示 10 ~ 23 点。i;// 从下一个位置开始找for(;ia.size();i){if(a[i]b[i](a[i]0a[i]9||a[i]Aa[i]N)){if(a[i]0a[i]9)ha[i]-0;elseha[i]-A10;break;}}✅ Step 4匹配分钟后两行字符串中第一个相同英文字母遍历字符串c和d找出第一个匹配的英文字母字符其位置索引即为分钟。for(inti0;ic.size();i){if(c[i]d[i]isalpha(c[i])){mi;break;}}✅ Step 5格式化输出结果使用星期数组w[day]输出星期小时和分钟使用%02d保证补零格式。coutw[day] ;printf(%02d:%02d,h,m);✅ 完整代码#includebits/stdc.husingnamespacestd;string a,b,c,d;intday,h,m;string w[10]{,MON,TUE,WED,THU,FRI,SAT,SUN};intmain(){cinabcd;// 1. 匹配星期几inti;for(i0;ia.size();i){if(a[i]b[i](a[i]Aa[i]G)){daya[i]-A1;break;}}// 2. 匹配小时i;for(;ia.size();i){if(a[i]b[i](a[i]0a[i]9||a[i]Aa[i]N)){if(a[i]0a[i]9)ha[i]-0;elseha[i]-A10;break;}}// 3. 匹配分钟for(inti0;ic.size();i){if(c[i]d[i]isalpha(c[i])){mi;break;}}// 4. 输出结果coutw[day] ;printf(%02d:%02d,h,m);return0;} 常见错误提醒错误类型说明星期字母范围错误仅限A~G不是所有大写字母都合法小时字符范围误判0~9与A~N才合法遍历位置未正确推进匹配第 2 个字符前需i移动位置输出格式错误小时/分钟需补零使用%02d✅ 总结归纳本题考查字符串逐位比较与格式化输出理解每组字符的映射含义是关键索引管理与字符范围判断尤为重要时间复杂度O(n)O(n)O(n)空间复杂度O(1)O(1)O(1) 思维拓展属于典型的“字符串逐位匹配 条件判断解码”题型使用w[day]进行【映射解码】是常见解题技巧与身份证号码校验、协议解析类问题具有结构类似可作为同类题训练模板