1014. 福尔摩斯的约会
⼤侦探福尔摩斯接到⼀张奇怪的字条:
“我们约会吧!
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
#include <bits/stdc++.h>
using namespace std;
int main(){
string a,b,c,d;
cin>>a>>b>>c>>d;
char t[2];//用来存第一个字符串中的两个正确答案
int n;//n用来存第二个字符串找到的答案
int i=0,j=0;//将i,j设为全局变量,方便寻找第一个字符串中的第二个答案
while(i<a.size()&&i<b.size()){
//这里必须判断是从A~G,而不能只是简单地判断它是否为大写字母
//因为周一到周日对应的是A~G,此外的所有大写字母都不符合条件,
//会有测试点给的是G以后的字母
if(a[i]==b[i]&&a[i]>='A'&&a[i]<='G')){
t[0]=a[i];
break;
}
i++;
}
i++;
while(i<a.size()&&i<b.size()){
if( a[i]==b[i] && (isdigit(a[i])||a[i]>='A'&&a[i]<='N')){
t[1]=a[i];
break;
}
i++;
}
while(j<c.size()&&j<d.size()){
if(c[j]==d[j]&&isalpha(c[j])){
n=j;
break;
}
j++;
}
string stu[10]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
cout<<stu[t[0]-'A']<<" ";
//小时可能为数字或字母
//A~N代表的是10点到23点,在-'A'之后此时为0,所以要加10
int m=isdigit(t[1])?t[1]-'0':t[1]-'A'+10;
printf("%02d:%02d",m,n);
return 0;
}
分析:
用两次while找出在第一个字符串中的两个正确答案。
isdigit(n)表示:n是否为数字
isalpha(n)表示:n是否为字母
%02d
表示如果不够两位,自动在数字前补零到两位。