PAT (Basic Level) Practice (中文)1014

1014 福尔摩斯的约会【PAT (Basic Level) Practice (中文)】 知识点: - C程序设计/数组/字符串 阅读详情

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

										题意分析

实际上这道题目并不难,本质上只是简单的字符查找比较输出,但题目的描述着实让人思路有点乱。尤其是第二个条件里的"第二对相同的字符",到底是从头到尾比较的第二对还是再第一个条件的基础上的第二对呢?经过测试发现应该是第一个条件的基础上的第二对。了解这一点后开始解题。

我在做题的时候思绪比较凌乱,于是产生了下面好几种做法,下面我分析一下我的各种奇葩做法吧!尽管这样,每种做法本质都是简单比较。我们采用的编译器是g++ 6.5.0版本。注意此题尽量不要使用cout输出 cin读入防止超时。另外读入字符串请不要用gets这种不安全的函数,干脆直接废弃不用。本博文末尾将会讲到可供替代的写法。

										做法1
#include <cstdio>
int main()
{
    char date[4][61];
    int day,hour,min;
    char week[7][4] = {
        "MON","TUE","WED",
        "THU","FRI","SAT",
        "SUN"
    };
    int count = 1;
    
    scanf("%s%s%s%s", date[0], date[1], date[2], date[3]);
    for(int i = 0;date[0][i] != '\0' && date[1][i] != '\0';i++)
    {
        if(date[0][i] >= 'A' && date[0][i] <= 'G' && date[0][i] == date[1][i] && count == 1)
        {
            day = date[0][i]-'A';
            ++count;
        }
        else if(count == 2 && date[0][i] == date[1][i] && (date[0][i] >= '0' && date[0][i] <= '9' || date[0][i] >= 'A' && date[0][i] <= 'N'))
        {
            if(date[0][i] >= '0' && date[0][i] <= '9')
                hour = date[0][i]-'0';
            else
                hour = date[0][i]-'A'+10;
            break;
        }
    }
    for(int i = 0;date[2][i] != '\0' && date[3][i] != '\0';i++)
    {
        if((date[2][i] >= 'a' && date[2][i] <= 'z' || date[2][i] >= 'A' && date[2][i] <= 'Z') && date[2][i] == date[3][i])
        {
            min = i;
            break;
        }
    }
    printf("%s %02d:%02d", week[day], hour, min);
    
    return 0;
}

先来说说这种做法的优势
首先这种做法意图很明确,分别求出三组时间(其中day是下标),再集中输出,注意day的获取需要限定在A–G范围内!!! hour需要在0–9或者A–N范围内!!!还有个小细节, “||“运算符优先级低于”&&”,需要括号括起,否则容易导致输入错误。
这种做法的缺点也很明显
程序略微冗余,实际上我们通过增加头文件可以改写部分程序如下

										方法1改写
#include <cstdio>
#include <ctype.h>
int main()
{
    char date[4][61];
    int day,hour,min;
    char week[7][4] = {
        "MON","TUE","WED",
        "THU","FRI","SAT",
        "SUN"
    };
    int count = 1;
    
    scanf("%s%s%s%s", date[0], date[1], date[2], date[3]);
    for(int i = 0;date[0][i] != '\0' && date[1][i] != '\0';i++)
    {
        if(date[0][i] >= 'A' && date[0][i] <= 'G' && date[0][i] == date[1][i] && count == 1)
        {
            day = date[0][i]-'A';
            ++count;
        }
        else if(count == 2 && date[0][i] == date[1][i] && (isdigit(date[0][i]) || date[0][i] >= 'A' && date[0][i] <= 'N'))
        {
            if(isdigit(date[0][i]))
                hour = date[0][i]-'0';
            else
                hour = date[0][i]-'A'+10;
            break;
        }
    }
    for(int i = 0;date[2][i] != '\0' && date[3][i] != '\0';i++)
    {
        if(isalpha(date[2][i]) && date[2][i] == date[3][i])
        {
            min = i;
            break;
        }
    }
    printf("%s %02d:%02d", week[day], hour, min);
    
    return 0;
}

粗略分析下时间复杂度为O(n),不使用cin和cout不会超时。

										方法二 

这种方法在每组得到结果后直接输出。

#include <cstdio>
#include <cstring>
int main()
{
    char date[4][61];
    int i;
    int len1,len2,len3,len4;
    char week[7][4] = {
        "MON","TUE","WED",
        "THU","FRI","SAT",
        "SUN"
    };
    
    scanf("%s%s%s%s", date[0], date[1], date[2], date[3]);
    len1 = strlen(date[0]);
    len2 = strlen(date[1]);
    len3 = strlen(date[2]);
    len4 = strlen(date[3]);
    for(i = 0;i < len1 && i < len2;i++)
    {
        if(date[0][i] == date[1][i] && date[0][i] >= 'A' && date[0][i] <= 'G')
        {
            printf("%s ", week[date[0][i]-'A']);
            break;
        }
    }
    for(i++;i < len1 && i < len2;i++)
    {
        if(date[0][i] == date[1][i])
            if(date[0][i] >= '0' && date[0][i] <= '9')
            {
                printf("%02d:", date[0][i]-'0');
                break;
            }
            else if(date[0][i] >= 'A' && date[0][i] <= 'N')
            {
                printf("%d:", date[0][i]-'A'+10);
                break;
            } 
    }
    for(i = 0;i < len3 && i < len4;i++)
        if(date[2][i] == date[3][i] && (date[2][i] >= 'a' && date[2][i] <= 'z' || date[2][i] >= 'A' && date[2][i] <= 'Z'))
        {
            printf("%02d", i);
            break;
        }
    
    return 0;
}

这种做法和上面的做法在时间上没啥大区别,但是更加整洁美观,我个人倾向解法二。

								替代gets()函数!!!!

首先我们讲讲gets函数为什么不安全:
我们的程序读入是以输入流的形式,假定我们有个字符数组容量为10,而gets函数读入的字符长度往往不确定,这时如果某个流长度超过了10,都会导致多余的部分超出数组范围而对计算机内其余数据存在擦写的隐患,这在有些情况下是灾难性的。所以C11直接强硬地废弃了gets函数。你可能会问:strcpy这一类的函数也有安全隐患,但是为什么不被废弃呢?这是因为strcpy的操作是程序员决定的,C语言要求程序员自己保证程序的安全性,gets函数的不安全性来自使用程序的用户而非程序员。

							 我们可以这样替代gets()函数

1.scanf()读入空格或者换行等空白字符分隔的多个字符串或者不含空格的字符串
比如:
上题读入四个字符串,每个字符串用换行符分割,我们就可以采用这种方式读入。
这样做的可行性在于scanf函数对一个字符串读入从第一个非空白字符开始,到第二个空白字符结束。(%c读入时特殊,它会读入空白字符)

2.fgets()函数读入字符串,它需要三个参数,格式:fgets(字符串首地址,字符串最大长度,读入文件)
一般在PTA中我们往往这样写(假设字符串为char str[15]):fgets(str,14,stdin);
注意fgets()函数会保存可能存在的换行符,如果题目指明了每个字符串以换行符结尾,那么上面所说的例子应该改为char str[16],fgets(str,15,stdin),str[14] = '\0’原因在于换行符占用了一个位置。stdin的意思时standard input(标准输入)。
关于fgets()函数的例子可以查看博主博文PTA乙级说反话

告别Keil手动分区!用CubeMX+VS Code一键生成带Bootloader的STM32 OTA工程 本文详细介绍了如何利用STM32CubeMX和VS Code实现STM32 OTA工程的自动化构建,告别传统Keil手动分区的繁琐流程。通过图形化配置Flash分区、自动生成链接脚本以及实现Bootloader跳转逻辑,开发者可以高效完成远程升级功能开发,显著提升嵌入式开发效率。 阅读详情

相关推荐

虚幻引擎5 AR开发教程02:构建和测试AR Android App

在本教程中,我们将学习如何在虚幻引擎 5 上构建和测试 AR 安卓应用。

mopanchun的博客 2650

PAT (Basic Level) Practice (中文)1014 福尔摩斯的约会 (20 分)

文章目录题目代码计时:01:16:18耗时1.省题1.1分钟time21.2分钟的条件1.3小时的条件1.4小时和分钟不满10的时候都要写0补齐1.5注意输入的拼写,别抄错 题目 代码 #include<stdio.h> #include <iostream> #include<algorithm> #include <string.h> #inc...

weixin_44266050的博客 409

基于STM32的半导体制冷片温度控制

制冷片温度控制,温控范围15℃~45℃,本人菜鸡一枚,大佬绕路。 #include "stm32f10x_gpio.h" #include "relay.h" void relay_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//Ê...

大白兔的博客 9017

PAT (Basic Level) Practice (中文)

1004 成绩排名 题目描述: 读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。 输入格式: 每个测试输入包含 1 个测试用例,格式为 第 1 行:正整数 n 第 2 行:第 1 个学生的姓名 学号 成绩 第 3 行:第 2 个学生的姓名 学号 成绩 … … … 第 n+1 行:第 n 个学生的姓名 学号 成绩 其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。 输出格式:

qq_49069362的博客 182

使用Java实现CRC16 MODBUS 格式校验

CRC16校验,测试如下 String str = "a5 98 03 00 00 5f c6 0f 7c 40 78 06 09 46 dc 6e db 00 16 3e 12 5c 98 00 19 98 0e 10 03 06 09 46 dc 6e db 03 0b bf 5f c6 0f 7c 43 bd b9 61 ee 96 76 99"; 校验规则: /** * CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结

weixin_45063710的博客 1316

单细胞实战之亚细胞分群从T/NK至CD4+T细胞——从入门到进阶(中级篇1)

亚细胞分群从T/NK至CD4+T细胞

zfyyzhys的博客 6392

1047 编程团体赛 (20 分)

编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。 现给定所有队员的比赛成绩,请你编写程序找出冠军队。 输入格式: 输入第一行给出一个正整数N(≤10​4​​),即所有参赛队员总数。随后N行,每行给出一位队员的成绩,格式为:队伍编号-队员编号 成绩,其中队伍编号为 1 到 1000 的正整数,队员编号为 1 到 10 的正...

Linuxsen的博客 1177

群晖设置公网ipv6方式域名解析访问

群晖、IPV6、域名解析

爬山虎的博客 2万+

PAT (Basic Level) Practice (中文)答案合集

准备复试专用,目标刷完全部中文题!

博客标题不能为空我也没办法 1万+

【CANoe16安装教程】亲测安装成功

CANoe16安装教程

qq_45302638的博客 2万+

【小白深度教程 1.3】使用 BP-Net 深度补全网络,进行 KITTI 稠密点云和图像融合(Depth Completion 实战)

在上一节中,我们展示了如何将从激光雷达获取的稀疏点云(深度)映射到图像。因此这篇论文我们尝试使用 Depth Completion(深度补全)技术,来将稀释的点云深度,补全为稠密深度。

2401_87064292的博客 1200

【PAT乙级】PAT (Basic Level) Practice (中文)训练记录

本博客用于记录PAT乙级题库做题新得

初见还是重逢的博客 4683

摆脱英文束缚!群晖Transmission4.0.4全新中文界面攻略

在群晖安装完官方Transmission4.0.4套件后,界面是英文状态的,不太好用。但是按照网上分享的原来4.0以前版本的方法更新UI又失败,所以自己搞了下成功了,分享给需要的朋友。

XiaoqiangClub的博客 5220

PAT 乙级 (Basic Level) Practice (中文)1014

1014 福尔摩斯的约会 (20 分) 大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&amp;hgsfdk d&amp;Hyscvnm。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的...

Arthur的博客 237

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

PAT(Basic Level) Practice(中文) 1014

【Basic Level】 *1013 #include <iostream> #include <cmath> #include <string> #include <algorithm> #include <iomanip> using namespace std; bool isPrime(int m) { for (int i = 3; i <= sqrt(m); i++) { if (m % i =

weixin_43437884的博客 156

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

PAT (Basic Level) Practice (中文) 1014 福尔摩斯的约会

1014福尔摩斯的约会(20分) 大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母D,代表星期四;第 2 对相同的字符是E,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到...

EASY_Artoria的博客 119

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

PAT (Basic Level) Practice (中文) 1014 福尔摩斯的约会

大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字母,代...

Jimmy Huang's Blog 261

PAT (Basic Level) Practice (中文)1014 福尔摩斯的约会

PAT (Basic Level) Practice (中文)1014 福尔摩斯的约会 (20 分)

ling_X_super的博客 234

浙江大学PAT (Basic Level) Practice (中文)1014福尔摩斯的约会JAVA实现代码及分析

1014 福尔摩斯的约会 这道题需要注意的地方有以下几点: ①决定星期几的是前两个字符串的第一个相同的大写字母,注意是第一个大写的字母,小写不算。 ②决定分钟数的是后两对字符串的第一个相同的字母所出现的位置,也就是它的下标位置,这里大小写字母均可以但是不可以是其他字符。 ③小时和分钟的输出格式是两位输出,也就是说不足两位时要在前面加0补足位数之后进行输出。 具体实现代码如下: import ja...

yingYing_monster的博客 356

PAT (Basic Level) Practice (中文)1014 福尔摩斯的约会 python

出处: https://pintia.cn/problem-sets/994805260223102976/problems/994805308755394560 大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第

Nothing is final!!! 213

PAT (Basic Level) Practice (中文)1014 福尔摩斯的约会(20 分)C语言

1014 福尔摩斯的约会(20 分) 大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&amp;hgsfdk d&amp;Hyscvnm。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的...

changaspl 898

PAT (Basic Level) Practice (中文)1014 福尔摩斯的约会 (20 分)

题目 大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字...

Alex 634
上一篇: 计算机中的数据存储与PTA
下一篇: PAT (Basic Level) Practice (中文)1024
小徐变大徐
博客等级 码龄7年 7粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值