题目描述
大侦探福尔摩斯接到一张奇怪的字条:我们约会吧!
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。
- 对比第三个和第四个字符串,任何大小写字母只要相对应了那就符合条件,可获得字符下标。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int main(){
char s1[1000];
char s2[1000];
char s3[1000];
char s4[1000];
char jilu[100]; //记录天,时
cin>>s1>>s2>>s3>>s4; //依次输入四个字符串,采用char
/*minlen是在s1和s2中获取最小字符串的长度,k作为jilu[]数组的有效长度,
temp则代表着记录符合第一对大写字母的字符下标,在记录第二对字符有很大的作用*/
int minlen = min(strlen(s1),strlen(s2)), k = 0, temp = 0;
for(int i = 0;i<minlen; i++){
if(s1[i]==s2[i]&&s1[i]>='A'&&s1[i]<='G'){
jilu[k++] = s1[i];//符合条件时,用jilu数组把字符记录
temp = i; //同时把该字符的下标传给temp
break; //记得break!
}
}
for(int i = temp+1;i<minlen; i++){ //在temp+1处开始判断,找到第二对字符
if(s1[i]==s2[i]&&((s1[i]>='0'&&s1[i]<='9')||(s1[i]>='A'&&s1[i]<='N'))){
jilu[k] = s1[i];//符合条件,用jilu数组记录
break; //记得break!
}
}
int day = jilu[0]-'A'+1; //计算天
int hour = 0; //初始化小时
//计算小时
if(jilu[1]>='A'&&jilu[1]<='N') //如果第二对字符是字母的话
hour = 10+(int)(jilu[1]-'A'); //就进行计算,这里实质是(int)(jilu[1]-'A')+9+1
else //否则就是数字
hour = jilu[1]-'0'; //直接传过去
int mlen = min(strlen(s3),strlen(s4)), t = 0;
for(int i = 0;i<mlen; i++){
if(s3[i]==s4[i]&&((s3[i]>='A'&&s3[i]<='Z')||(s3[i]>='a'&&s3[i]<='z'))){
t=i; //如果符合条件,那么就传字符的下标
break;
}
}
//用switch来实现,也可以用map键值对实现
switch(day){
case 1:
cout<<"MON"<<" ";
break;
case 2:
cout<<"TUE"<<" ";
break;
case 3:
cout<<"WED"<<" ";
break;
case 4:
cout<<"THU"<<" ";
break;
case 5:
cout<<"FRI"<<" ";
break;
case 6:
cout<<"SAT"<<" ";
break;
case 7:
cout<<"SUN"<<" ";
break;
}
//记得前导0,为两个,所以用%02d
//这边用printf会比cout方便一点
printf("%02d:%02d\n",hour,t);
}