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
这道题乍一看思路不是很清晰,然后就去写程序了,不出意外,有两个测试点没通过。后来又读了几遍题,发现漏掉了细节,强调一下“大侦探很快就明白了,
字条上奇怪的乱码实际上就是约会的时间星期四 14:04
,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D
,代表星期四;第 2
对相同的字符是 E
,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A
到 N
表示);后面两字符串第
1 对相同的英文字母 s
出现在第 4 个位置(从 0 开始计数)上,代表第 4 分钟” 这里面隐藏着很多细节,必须要明白下面几点
1.确定星期,必须是s1和s2中第一对相等的大写字母,大写字母在字母表中的次序代表星期几,'A'~'G'分别对应星期一到星期日
2.确定小时,在确定星期后,接着在s1和s2中找相第二对相等的字符。注意不需要从头开始,因为题目要求在发现第一对相等的大写字母后,接着向后遍历找相等的字符。找到以后跳出循环,不用再找了。
因为小时的范围是0~23,所以当找到的相等的字符范围在'0'~'9'之间时,就表示第0到第9小时;超过9小时,就要用24进制来表示小时了,'A'~'N'分别对应10~23,类似于十六进制。
所以查找的字符范围在'0'~'9'或'A'~'N',查找到以后再转化为对应的小时,这种情况有点麻烦。
3.确定分钟,在s3和s4中查找第一对相等的字母以后跳出循环,字母可以是大写也可以是小写,因为题目只要求是"第 1 对相同的英文字母",字母的位置就代表分钟,注意字母的位置从0开始。
4.然后就是要注意输出格式了,小时和分钟小于10的时候要在前面补0。
下面附上代码上代码
1 #include<iostream> 2 #include<ctype.h> 3 #include<string> 4 using namespace std; 5 int main () 6 { 7 string s1,s2,s3,s4; 8 cin>>s1>>s2>>s3>>s4; 9 char week,hour; 10 int len=s1.length()>s2.length()?s2.length():s1.length();//获取s1、s2中长度更小的 11 for(int i=0,flag=1;i<len;i++) //获取星期和小时 12 { 13 if(flag==1&&s1[i]==s2[i]&&('A'<=s1[i]&&s1[i]<='G')) 14 { 15 week=s1[i]; //第一对相等的字母确定星期 16 flag++; 17 } 18 else if(s1[i]==s2[i]&&(('0'<=s1[i]&&s1[i]<='9')||('A'<=s1[i]&&s1[i]<='N'))&&flag==2) 19 { 20 hour=s1[i]; //第二对相等的字符确定小时,并结束循环 21 break; 22 } 23 } 24 int minute=0; 25 len=s3.length()>s4.length()?s4.length():s3.length();//获取s3、s4中长度更小的 26 for(int i=0;i<len;i++) //确定分钟 27 { 28 if(s3[i]==s4[i]&&isalpha(s3[i])&&isalpha(s4[i])) 29 { 30 minute=i; 31 break; 32 } 33 } 34 switch(week-'A'+1) 35 { //输出星期 36 case 1: cout<<"MON ";break; 37 case 2: cout<<"TUE ";break; 38 case 3: cout<<"WED ";break; 39 case 4: cout<<"THU ";break; 40 case 5: cout<<"FRI ";break; 41 case 6: cout<<"SAT ";break; 42 case 7: cout<<"SUN ";break; 43 } 44 if('A'<=hour&&hour<='N') //输出小时 45 cout<<hour-'A'+10<<':'; 46 else if('0'<=hour&&hour<='9') 47 cout<<'0'<<hour-'0'<<':'; 48 if(minute<10) //输出分钟 49 cout<<'0'<<minute; 50 else 51 cout<<minute; 52 return 0; 53 }
ac了