1014 福尔摩斯的约会

1014 福尔摩斯的约会 (20分)
 

大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 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了

 

posted @ 2020-05-01 11:11  和运气碰碰  阅读(245)  评论(0编辑  收藏  举报