大侦探福尔摩斯接到一张奇怪的字条:
我们约会吧!
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
解题思路:
1,星期需要找出相同位置第一个相同的大写字母,而且在A-G之间
2,小时需要在星期之后重复的大写字母或数字,在0-9和A-N之间
3,分钟只要找到相同的字母就行,都是大写字母或者都是小写字母
需要注意的是:大写字母与小写字母不相同,输出时需要补0,如输出9小时需要输出09
c++代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a1,a2;
cin >> a1 >> a2;
string b1,b2;
cin >> b1 >> b2;
//小时对应表
map<char,int> hour = {{'0',0},{'1',1},{'2',2},{'3',3},{'4',4},{'5',5},{'6',6},{'7',7},{'8',8},{'9',9},{'A',10},{'B',11},{'C',12},{'D',13},{'E',14},{'F',15},{'G',16},{'H',17},{'I',18},{'J',19},{'K',20},{'L',21},{'M',22},{'N',23},};
//星期表
map<char,string> day = {{'A',"MON"},{'B',"TUE"},{'C',"WED"},{'D',"THU"},{'E',"FRI"},{'F',"SAT"},{'G',"SUN"},};
//初始化
char day_c;
char hour_c;
int min_i;
//搜索
int i = 0;//搜索位置
//星期
while(i < min(a1.size(),a2.size()))
{
char c1 = a1[i];
char c2 = a2[i];
if(c1 == c2 && c1 >= 'A' && c1 <='G')
{
day_c = c1;
break;
}
++i;
}
//小时
++i;
while(i < min(a1.size(),a2.size()))
{
char c1 = a1[i];
char c2 = a2[i];
if(c1 == c2 && (c1 >= 'A' && c1 <='N' || isdigit(c1)))
{
hour_c = c1;
break;
}
++i;
}
//分钟
i = 0;
while(i < min(b1.size(),b2.size()))
{
char c1 = b1[i];
char c2 = b2[i];
if (c1 == c2 && isalpha(c1))
{
min_i = i;
break;
}
++i;
}
string no1 = day[day_c];
int hour_i = hour[hour_c];
string no2 = "";
if(hour_i <= 9)
{
no2 += '0';
}
no2 += to_string(hour_i);
string no3 = "";
if(min_i <= 9)
{
no3 += '0';
}
no3 += to_string(min_i);
cout << no1 << " " << no2 << ":" << no3;
return 0;
}