pat 乙级 1014 福尔摩斯的约会 (C++)

题目

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

分析

这个题,题目很长,有点点绕,看似是一个推理题,实则是一个字符匹配题。不要慌,只需分别求约会时礼拜几,约会时几点,具体分钟然后连起来就可以了。

  • 对于礼拜几。一个星期共7天,所以只需找到前面两个字符串中字符相等(第一次)属于A~G的字符
  • 对于几点。分为0-9点和10-23点,前者,在前加0输出;后者则是找出前面两个字符串中字符相等(第二次)属于A~N的字符
  • 对于具体分钟。0-9时,在前加0输出;10-59时,转为字符串输出。

AC代码

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
string Day(char c)
{
    string day;
    switch(c)
    {
        case 'A':day="MON";break;
        case 'B':day="TUE";break;
        case 'C':day="WED";break;
        case 'D':day="THU";break;
        case 'E':day="FRI";break;
        case 'F':day="SAT";break;
        case 'G':day="SUN";break;
    }
    return day;
}
string Hour(char c)
{
    string day;
    switch(c)
    {
        case 'A':day="10";break;
        case 'B':day="11";break;
        case 'C':day="12";break;
        case 'D':day="13";break;
        case 'E':day="14";break;
        case 'F':day="15";break;
        case 'G':day="16";break;
        case 'H':day="17";break;
        case 'I':day="18";break;
        case 'J':day="19";break;
        case 'K':day="20";break;
        case 'L':day="21";break;
        case 'M':day="22";break;
        case 'N':day="23";break;
    }
    return day;
}

int main()
{
    int i,flag=0;
    string str[4],day,hour,min;
    char ch[4][61];
    
    for(i=0;i<4;i++)
    {
        cin>>str[i];
        strcpy(ch[i],str[i].c_str());
    }
    //求约会是礼拜几和几点
    for(i=0;i<61;i++)
    {
        if(ch[0][i]==ch[1][i])
        {
            if(ch[0][i]>='A'&&ch[0][i]<='G'&&flag==0)
            {
                day=Day(ch[0][i]);
                flag=1;
                continue; 
            }
            int temp=ch[0][i]-'0';
            if(temp>=0&&temp<9&&flag==1)
            {
                hour="0"+to_string(temp);
                break;
            }
            
            if(ch[0][i]>='A'&&ch[0][i]<='N'&&flag==1)
            {
                hour=Hour(ch[0][i]);
                break;
            }
        }
    }
    //分钟
    for(i=0;i<61;i++)
    {
        if(ch[2][i]==ch[3][i])
        {
            if((ch[2][i]>='a'&&ch[2][i]<='z')||(ch[2][i]>='A'&&ch[2][i]<='Z'))
            {
                if(i<=9)
                {
                    min="0"+to_string(i);
                    break;
                }
                else
                {
                    min=to_string(i);
                    break;
                }
            }
        }
            
    }
    cout<<day+" "+hour+":"+min;
    return 0;
}

总结

  • 代码长度比较长,选择数据类型时没有太多思考,后面会优化一下。
  • 在提交的过程中,总是有个点不得分。后面仔细读题,发现,开始读题理解错误。求分钟时它是以第3、4字符串中第一对相同字母出现的位置来判定的,以为字母要求小写字母,其实只是举例而已。
    正在刷pat的菜鸟一枚,希望得到鼓励与支持
    有任何问题,在评论区留言告诉我哦

更多题解
pat 乙级 题解汇总(持续更新)(C++)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值