题目
大侦探福尔摩斯接到一张奇怪的字条: 我们约会吧!3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04.
因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示);后面两字符串第 1 对相同的英文字母 s 出现在第 4 个位置(从 0 开始计数)上,代表第 4 分钟。
现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。
输入格式:
输入在 4 行中分别给出 4 个非空、不包含空格、且长度不超过 60 的字符串。
输出格式:
在一行中输出约会的时间,格式为 DAY HH:MM,其中 DAY 是某星期的 3 字符缩写,即 MON 表示星期一,TUE 表示星期二,WED 表示星期三,THU 表示星期四,FRI 表示星期五,SAT 表示星期六,SUN 表示星期日。题目输入保证每个测试存在唯一解。
输入样例:
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
输出样例:
THU 14:04
分析
这个题,题目很长,有点点绕,看似是一个推理题,实则是一个字符匹配题。不要慌,只需分别求约会时礼拜几,约会时几点,具体分钟然后连起来就可以了。
- 对于礼拜几。一个星期共7天,所以只需找到前面两个字符串中字符相等(第一次) 且 属于A~G的字符
- 对于几点。分为0-9点和10-23点,前者,在前加0输出;后者则是找出前面两个字符串中字符相等(第二次) 且 属于A~N的字符。
- 对于具体分钟。0-9时,在前加0输出;10-59时,转为字符串输出。
AC代码
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
string Day(char c)
{string day;switch(c){case 'A':day="MON";break;case 'B':day="TUE";break;case 'C':day="WED";break;case 'D':day="THU";break;case 'E':day="FRI";break;case 'F':day="SAT";break;case 'G':day="SUN";break;}return day;
}
string Hour(char c)
{string day;switch(c){case 'A':day="10";break;case 'B':day="11";break;case 'C':day="12";break;case 'D':day="13";break;case 'E':day="14";break;case 'F':day="15";break;case 'G':day="16";break;case 'H':day="17";break;case 'I':day="18";break;case 'J':day="19";break;case 'K':day="20";break;case 'L':day="21";break;case 'M':day="22";break;case 'N':day="23";break;}return day;
}int main()
{int i,flag=0;string str[4],day,hour,min;char ch[4][61];for(i=0;i<4;i++){cin>>str[i];strcpy(ch[i],str[i].c_str());}//求约会是礼拜几和几点for(i=0;i<61;i++){if(ch[0][i]==ch[1][i]){if(ch[0][i]>='A'&&ch[0][i]<='G'&&flag==0){day=Day(ch[0][i]);flag=1;continue; }int temp=ch[0][i]-'0';if(temp>=0&&temp<9&&flag==1){hour="0"+to_string(temp);break;}if(ch[0][i]>='A'&&ch[0][i]<='N'&&flag==1){hour=Hour(ch[0][i]);break;}}}//分钟for(i=0;i<61;i++){if(ch[2][i]==ch[3][i]){if((ch[2][i]>='a'&&ch[2][i]<='z')||(ch[2][i]>='A'&&ch[2][i]<='Z')){if(i<=9){min="0"+to_string(i);break;}else{min=to_string(i);break;}}}}cout<<day+" "+hour+":"+min;return 0;
}
总结
- 代码长度比较长,选择数据类型时没有太多思考,后面会优化一下。
- 在提交的过程中,总是有个点不得分。后面仔细读题,发现,开始读题理解错误。求分钟时它是以第3、4字符串中第一对相同字母出现的位置来判定的,以为字母要求小写字母,其实只是举例而已。
正在刷pat的菜鸟一枚,希望得到鼓励与支持
有任何问题,在评论区留言告诉我哦
更多题解
pat 乙级 题解汇总(持续更新)(C++)