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

/*
题目初解:
这里题目给出两对字符串,在两对字符串中找相同的字符,然后判断字符属于日期还是时间
还是非法字符,以题目为例子,第一个相同字符为D,D为第4个字符D代表星期四;那么星期
就是有ABCDEFG这7个字符来代表的,然后第二个相同字符为E,第5个字符,那么可以发现
小时是用0123456789ABCDEFGHIJKLMN这24个字符代表小时;然后第三个相同字符s是看
在字符串的第几个位置就是第几分钟;
输出格式为:
星期:小时:分钟;
总结一下,我们要在两队字符串中找到最开始3个字符,首先找到日期,才能找小时
找到小时才能找分钟
这里用3个字符变量存放字符;3个都找到才能进行输出,题目保证有唯一解,说明一定有解
并且只有一个;
每一个变量有对应的输出格式;所以每个字符是需要单独输出的;
这里从题目格式看到,小时和分钟为一位数时需要补0;

*/

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main(){
    //读入这两对字符串;
    string s0,s1,s2,s3;
    cin>>s0>>s1>>s2>>s3;
    //用数组存放三个数据;
    char c[2];    //存放3个字符;
    int flag=0;    //falg指向当前查找进度;(日时分)
    int date=0;    //找到日期的标志;
    int hour=0;    //找到小时的标志;
    int min=0;    //找到分钟的标志;
    //第一对字符串;
    int len=0;
    if(s0.length()>=s1.length()){
        len=s1.length();
    }
    else{
        len=s0.length();
    }        //这里取长度短的字符串作为比较边界,因为在这之后没有可比较的了
        //比如:
            //abab
            //ababccccc    这里abab之后没有可比较的;
    //逐个检查;
    for(int i=0;i<len;i++){
        //相同字符;
        if(s0[i]==s1[i]){
            //查找日期字符;
            if(s0[i]>='A'&&s0[i]<='G'&&date==0){
                c[flag]=s0[i];
                flag++;
                date=1;
            }
            //查找小时字符;
            else if(hour==0&&date==1){
                if(s0[i]>='0'&&s0[i]<='9'){
                    hour=1;
                    c[flag]=s0[i];
                    flag++;
                }
                else if(s0[i]>='A'&&s0[i]<='N'){
                    hour=1;
                    c[flag]=s0[i];
                    flag++;
                }
            }
            //查找分钟字符所在位置;
            else if(hour==1&&date==1){
                if(s0[i]>='a'&&s0[i]<='z'){
                    min=i;
                }
                else if(s0[i]>='A'&&s0[i]<='Z'){
                    min=i;
                }
            }
        }
    }
        //若在第一对字符串找完了就不需要找第二对字符串了;
    //若在第一对里连日期都没找到,那么第二对都需要找了;
    //第二对字符串;
    if(s2.length()>=s3.length()){
        len=s3.length();
    }
    else{
        len=s2.length();
    }
    for(int i=0;i<len;i++){
        //相同字符;
        if(s2[i]==s3[i]){    //同样的找日期;
            //查找日期字符;
            if(s2[i]>='A'&&s2[i]<='G'&&date==0){
                c[flag]=s2[i];
                flag++;
                date=1;
            }
            //查找小时字符;
            else if(hour==0&&date==1){
                if(s2[i]>='0'&&s2[i]<='9'){
                    hour=1;
                    c[flag]=s2[i];
                    flag++;
                }
                else if(s2[i]>='A'&&s2[i]<='N'){
                    hour=1;
                    c[flag]=s2[i];
                    flag++;
                }
            }
            //查找分钟字符所在位置;
            else if(hour==1&&date==1){
                if(s2[i]>='a'&&s2[i]<='z'){
                    min=i;
                }
                else if(s2[i]>='A'&&s2[i]<='Z'){
                    min=i;
                }
            }
        }
    }
    //按照对应格式进行输出;
    //输出日期;
    if(c[0]=='A'){
        cout<<"MON"<<" ";
    }
    else if(c[0]=='B'){
        cout<<"TUE"<<" ";
    }
    else if(c[0]=='C'){
        cout<<"WED"<<" ";
    }
    else if(c[0]=='D'){
        cout<<"THU"<<" ";
    }
    else if(c[0]=='E'){
        cout<<"FRI"<<" ";
    }
    else if(c[0]=='F'){
        cout<<"SAT"<<" ";
    }
    else if(c[0]=='G'){
        cout<<"SUN"<<" ";
    }
    //输出小时;
    if(c[1]>='0'&&c[1]<='9'){
        hour=c[1]-'0';    //
    }
    else if(c[1]>='A'&&c[1]<='N'){
        hour=10+c[1]-'A';
    }
    printf("%02d:",hour);    //小时中为有一位数的情况;所以使用%02d补0;
    //输出分钟;
    printf("%02d",min);    //分钟数;
    return 0;
}
/*
解题反思:本题考察一个字符匹配,然后一个时按照格式输出,这里对c++的格式输出还
不够熟练,对cout操作符不熟悉,采用的c语言的格式输出;
*/

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值