PAT 乙级 福尔摩斯的约会

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

题目

大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 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表示星期日。题目输入保证每个测试存在唯一解。

示例1

输入

3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm

输出

THU 14:04

思考和总结

  • 处理四个字符串的方式

开始自己使用的是string类,直接定义string的数组进行存储,但最后发现网上大多AC都使用char的数组来提高存储效率,还是太年轻了。

一开始还忘记的数组初始化,补充一下:(使用大括号

string week[7] = {"MON","TUE","WED","THU","FRI","SAT","SUN"};
  • 处理前导零,大多题目都会涉及。

自己一开始的想法是每次都去判断,然后在做处理。看了大多网上AC后发现了个解决方法:

#include <iomanip>

//形式1
cout.fill('0');
cout << Week[week] << ' ' << setw(2) << hour << ':' << setw(2) << min;

//形式2
cout<<day<<" "<<setw(2)<<setfill('0')<<HH<<":"<<setw(2)<<setfill('0')<<MM<<endl;
  • 坑坑坑
    前面两个的判断范围要比大写字母范围要小。

个人代码(c++)

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string a,b,c,d;

    string week[7] = {"MON","TUE","WED","THU","FRI","SAT","SUN"};


    cin >> a >> b >> c >> d;

    int max1,max2;

    max1 = (a.length() > b.length() ? a.length() : b.length());
    max2 = (c.length() > d.length() ? c.length() : d.length());

    for (int i = 0;i < max1 ;++i)
    {
        if(a[i] - 'A' >= 0 && a[i] - 'G' <= 0)
        {
            if (a[i] == b[i])
            {
                cout << week[a[i] - 'A'] << " ";

                i++;
                for(;i < max1;++i)
                {
                    if(a[i] - '0' >=0 && a[i] - '9' <= 0)
                    {
                        if (a[i] == b[i])
                        {
                            cout << "0" << (a[i] - '0');
                            i = max1;
                            break;
                        }
                    }
                    if(a[i] - 'A' >= 0 && a[i] - 'N' <= 0)
                    {
                        if (a[i] == b[i])
                        {
                            cout <<(a[i] - 'A') + 10;
                            i = max1;
                            break;
                        }
                    }
                }
            }
        }
    }

    cout << ":";

    for (int j = 0;j < max2; ++j)
    {
        if ((c[j] - 'A' >= 0 && c[j]- 'Z' <= 0) || (c[j] - 'a' >= 0 && c[j]- 'z' <= 0))
            if (c[j] == d[j])
            {
                if (j < 10)
                    cout << "0" << j;
                else
                    cout << j;
                break;
            }
    }

    return 0;
}

牛客网(Dalao)代码

#include <stdio.h>
#include <iostream>
#include <iomanip>
using namespace std;
 
 
int main()
{
    char input1[61], input2[61], input3[61], input4[61];
     
    int hour, min,week;
    char *Week[] = { "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN" };
 
    cin >> input1 >> input2 >> input3 >> input4;
 
 
    for (int i = 0,temp='A'; input1[i] != '\0'; i++){
        if (input1[i] >= temp &&input1[i] <= 'Z'){
            if (input2[i] == input1[i] && temp == 'A'){
                week = input1[i] - 'A';
                temp = '0';
                i++;
            }
            if (input2[i] == input1[i] && temp == '0'){
                if (input1[i] <= '9')    hour = input1[i] - '0';
                else        hour = input1[i] - 'A' + 10;
                break;
            }
        }
 
    }
    for (int i = 0; input3[i] != '\0'; i++){
        if (input3[i] == input4[i] &&
            ((input4[i] >= 'a' && input4[i] <= 'z') ||
            (input4[i] >= 'A' && input4[i] <= 'Z')))
        {
            min = i;
            break;
        }
    }
    cout.fill('0');
    cout << Week[week] << ' ' << setw(2) << hour << ':' << setw(2) << min;
    return 0;
 
 
}

注:以上思路均来源于网上。文章目的只是为了自己学习总结回顾,欢迎指出错误,相互学习。如有冒犯,请联系删除,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值