题目描述:
大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 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
思路:这道题应该是我最近遇到的难度稍微大一点的题了,难点不在构思上,在于题目理解,还有输出格式上,花了不少时间。
分析题目条件后可以知道如下三个条件:
- 第一个相同的字母只能是大写的,范围在‘A’~'G'之间(记住这是唯一条件);
- 第二个相同的字符要么是‘A’~‘N’,要么0~9;(这里格外注意输出时候的变换);
- 相等的字符必须是字母,大小写都无所谓。
#include<iostream>
#include<string>
using namespace std;
void date(char s);
int main()
{
string s1,s2,s3,s4;
cin >> s1 >> s2 >>s3 >>s4;
int a=1; //用a去表明是第几个相等的字符;
char day,hour;
int minute;
for(int i=0;i<s1.length()&&i<s2.length();++i){
if(s1[i]==s2[i]&&((s1[i]>='0'&&s1[i]<='9')||(s1[i]>='A'&&s1[i]<='N'))){ //满足第二个条件
//第二次找到的相等字符;
if(a==2){
hour = s1[i];
break;
}
}
if(s1[i]==s2[i]&&(s1[i]>='A'&&s1[i]<='G')){ //字符相等 且满足第一个条件;
//第一次找到的相等字符;
if(a==1){
date(s1[i]);
a++;
}
continue;
}
}
//第三个条件;
for(int j=0;j<s3.length()&&j<s4.length();++j){
if(s3[j]==s4[j]&&(s3[j]>='A'&&s3[j]<='z'))
{
minute = j;
}
}
//小时在0~9之间,需要在前面补0;
if(hour>='0'&&hour<='9'){
cout <<'0'<<hour<<":";
}
//在‘A’~‘N’之间,需要转化,如下式:
else{
cout <<hour-'A' + 10 <<":";
}
//分钟的输出格式;
printf("%02d",minute);
return 0;
}
void date(char s){
switch(s){
case 'A':
cout<< "MON ";
break;
case 'B':
cout<< "TUE ";
break;
case 'C':
cout<< "WED ";
break;
case 'D':
cout<< "THU ";
break;
case 'E':
cout<< "FRI ";
break;
case 'F':
cout<< "SAT ";
break;
case 'G':
cout<< "SUN ";
break;
}
}
小结:代码思路清楚,但是写的长了,还有优化的空间,需要注意的有:
- 在遍历的时候,将第二个条件放在第一个条件之前,是为了避免第一个条件对a的操作影响第二个条件,因为第一二条件之间是有重合的,你会发现有些情况下那个相等的字符既可以进入条件1也可进入条件2,所以需要调整顺序;
- hour的输出,在0~9需要补0,在A~N需要转化成数字(hour-'A'+10);
- minute的输出格式我用了printf,是为了方便,一般情况下不建议cin与scanf,cout与printf混用,因为有的时候会发生难以预料的错误。在有些情况下可以混用,日后有机会将整理一下这个问题。