PAT 乙级 1014(福尔摩斯的约会)

PAT 乙级 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

代码

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    char s1[61],s2[61],s3[61],s4[61];
    int num;
    cin >> s1 >> s2 >> s3 >>s4;
    for(int i=0;i<strlen(s1);i++)
    {
        if(s1[i]==s2[i]&& isupper(s1[i]) && s1[i]-65<8)
        {
            num=i;
            switch (s1[i])
            {
            case 'A':
                cout << "MON"<<' ';
                break;
            case 'B':
                cout << "TUE"<<' ';
                break;
            case 'C':
                cout << "WED"<<' ';
                break;
            case 'D':
                cout << "THU"<<' ';
                break;
            case 'E':
                cout << "FRI"<<' ';
                break;
            case 'F':
                cout << "SAT"<<' ';
                break;
            case 'G':
                cout << "SUN"<<' ';
                break;
            default:
                break;
            }
            break;
        }
    }
    for(int i=num+1;i<strlen(s1);i++)
    {
        if(s1[i]==s2[i]&& (isupper(s1[i])||isdigit(s1[i])) )
        {
            if(isdigit(s1[i]))
            {
                cout<<"0"<<s1[i]<<':';
                break;
            }
            if(isupper(s1[i])&&s1[i]-65+10<24)
            {
                cout<<s1[i]-65+10<<':';
                break;
            }
        }
    }
    for(int i=0;i<strlen(s3);i++)
    {
        if(s3[i]==s4[i]&& isalpha(s3[i]))
        {
            if(i<10) cout <<'0'<<i;
            else cout <<i;
        }
    }
    system("pause");
}

思路

多么浪漫的名字啊,福尔摩斯的约会,嘿嘿,不过俺也是有npy的人了,哈哈哈。
好吧,这道题呢,判定起来有很多小的细节,一开始我有三处判定错误,让我好找啊!

  • 题目中代表星期的要求是:两字符串中第 1 对相同的大写英文字母,注意是大写字母,所以我们可以用isupper(s1[i])来判定是否为大写,另外除了大写之外有隐藏条件:因为只有星期一到星期日,所以超过这个范围的也需要剔除掉,我们加了s1[i]-65<8,通过这个条件限定在7之中
	for(int i=0;i<strlen(s1);i++)
    {
        if(s1[i]==s2[i]&& isupper(s1[i]) && s1[i]-65<8)
        {
            num=i;
            switch (s1[i])
            {
            case 'A':
                cout << "MON"<<' ';
                break;
            case 'B':
                cout << "TUE"<<' ';
                break;
            case 'C':
                cout << "WED"<<' ';
                break;
            case 'D':
                cout << "THU"<<' ';
                break;
            case 'E':
                cout << "FRI"<<' ';
                break;
            case 'F':
                cout << "SAT"<<' ';
                break;
            case 'G':
                cout << "SUN"<<' ';
                break;
            default:
                break;
            }
            break;
        }
    }
  • 题目中要求小时的要求是相同的字符和”于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示“,那么就需要判断为数字和大写字母,同样的大写字母范围有限制,这里使用s1[i]-65+10<24
	for(int i=num+1;i<strlen(s1);i++)
    {
        if(s1[i]==s2[i]&& (isupper(s1[i])||isdigit(s1[i])) )
        {
            if(isdigit(s1[i]))
            {
                cout<<"0"<<s1[i]<<':';
                break;
            }
            if(isupper(s1[i])&&s1[i]-65+10<24)
            {
                cout<<s1[i]-65+10<<':';
                break;
            }
        }
    }
  • 题目中分钟的要求是相同的英文字母出现在第n 个位置(从 0 开始计数)上,代表第 n分钟,那么众所周知,范围是0-59,那么就有
	for(int i=0;i<strlen(s3);i++)
    {
        if(s3[i]==s4[i]&& isalpha(s3[i]))
        {
            if(i<10) cout <<'0'<<i;
            else cout <<i;
        }
    }

好吧,这里不需要限制0-59,应该是题目默认了。
如此,完成!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值