大侦探福尔摩斯接到一张奇怪的字条: 我们约会吧!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时,转为字符串输出。
#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的菜鸟一枚,希望得到鼓励与支持
有任何问题,在评论区留言告诉我哦