CCF CSP认证 历年题目自练Day47
题目
试题编号: 201712-3
试题名称: Crontab
时间限制: 10.0s
内存限制: 256.0MB




样例输入
3 201711170032 201711222352
0 7 * * 1,3-5 get_up
30 23 * * Sat,Sun go_to_bed
15 12,18 * * * have_dinner
样例输出
201711170700 get_up
201711171215 have_dinner
201711171815 have_dinner
201711181215 have_dinner
201711181815 have_dinner
201711182330 go_to_bed
201711191215 have_dinner
201711191815 have_dinner
201711192330 go_to_bed
201711200700 get_up
201711201215 have_dinner
201711201815 have_dinner
201711211215 have_dinner
201711211815 have_dinner
201711220700 get_up
201711221215 have_dinner
201711221815 have_dinner
题目分析(个人理解)
- 首先此题是基于字符串处理的模拟题,根据题目的描述,我们要对输入的所有内容进行标准化,星期,月份都可以用任意大小写的字母的缩写或者数字表示具体内容,由于输入的第一行也就是开始时间和结束时间采用数字表示,所以,我将在后面输入的命令也全部标准化为数字,注意星期从0(表示周天)开始,到6。月份从1开始到12。
- 由于本题处理内容较多,我采用函数对方法封装,对于处理星期和月份标准化的函数,如果实参是int则直接返回,如果是英文字母则全部转换为小写之后可以根据位序返回具体的值。
- 接下来处理命令,对于命令有以下一些特殊字符,逗号表示并的关系,-表示开始结束(如果是星期的位置,1,3-5表示周一,周三,周四 ,周五),星号表示所有。(月份同理)尤其注意重复的情况,比如:3,1-5需要进行去重,不然后面会出现重复输出的情况,由于我全部用列表存储,那么可以直接用list(set())去重。(元组值的唯一性),分钟小时星期是同样的标准化方法。
- 标准化完成后,要进行判断,判断命令是否在第一行输入的给定的时间范围之内,数字化标准后,只需要用数值判断范围即可。如果命令的时间不在此区间则直接跳过判断下一个命令,还要判断每个月的日期是否正常,比如11月31日这种,还要判断星期是否正常:比如2023年11月18日是周五(实际上是周六)。
- 对于日期数是否正常,只用判断该日期是否小于这个月的最大日期数,由于2月因为闰年有特殊性,因此分为闰年和非闰年分别判断,对于星期,我们根据题目条件已知1970年1月1日是周四,所以我们可以推算出对应的星期(已知年月日推星期,这我在前面的打卡中也遇到过此类题目)。只需算出19700101到命令的执行日期的总天数对7取余数(算出多少周)再加四,再对7取余即可得知星期。我们扩展一下,如果不给1970年1月1日是周四阁下该如何应对?大家可以搜一下蔡勒公式。
- 上代码!!!
# crontab
Days_of_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]#不是闰年
Days_of_mons_in_leap_year = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]#闰年
Month_string_list = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
Weekday_string_list = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']def m_string2int(m): # 将所有月份全部转化为数字try:a = int(m)return aexcept:for i in range(12):if (m.lower() == Month_string_list[i].lower()): # 使用.lower()函数转换为小写return i + 1def w_string2int(w): # 将所有星期全部换为数字try:a = int(w)return aexcept:for i in range(7):if (w.lower() == Weekday_string_list[i].lower()): # 使用.lower()函数转换为小写return idef ddmm(day, mon): # 闰年的2月29天,1 3 5 7 8 10 12 31days ,其他30days# d为输入天的字符串,m为输入月份的字符串# start为开始的天,end为结束的天# 函数返回所有符合条件的天的listday_mon_set = []dayset = []days = day.split(',') # 逗号是并的关系for d in days:if (d == '*'):dayset = list(i + 1 for i in range(31))elif (len(d.split('-')) != 1):s, e = list(map(int, d.split('-')))for i in range(s, e + 1):dayset.append(i)else:dayset.append(int(d))dayset=list(set(dayset))#去重,如果出现3,1-5的情况避免重复输出3mons = mon.split(',')#逗号是并的关系monset = []for m in mons:if (m == '*'):monset = list(i + 1 for i in range(12))elif (len(m.split('-')) != 1):s, e = m.split('-')for i in range(m_string2int(s), m_string2int(e) + 1):monset.append(i)else:monset.append(m_string2int(m))monset=list(set(monset))#去重,如果出现3,1-5的情况避免重复输出3for x in monset:for y in dayset:day_mon_set.append(x * 100 + y)#11月12日就是1112return day_mon_set#返回月日的格式def MMHH(mm, hh):#分钟小时标准化min_hour_set = []minset = []hourset = []mms = mm.split(',')for m in mms:if (m == '*'):minset = list(i for i in range(60))elif (len(m.split('-')) != 1):s, e = list(map(int, m.split('-')))for i in range(s, e + 1):minset.append(i)else:minset.append(int(m))minset = list(set(minset)) # 去重,如果出现3,1-5的情况避免重复输出3hhs = hh.split(',')for h in hhs:if (h == '*'):hourset = list(i for i in range(24))elif (len(h.split('-')) != 1):s, e = list(map(int, h.split('-')))for i in range(s, e + 1):hourset.append(i)else:hourset.append(int(h))hourset = list(set(hourset)) # 去重,如果出现3,1-5的情况避免重复输出3for h in hourset:for m in minset:min_hour_set.append(h * 100 + m)return min_hour_setdef day_of_week(ww):#标准化星期if (ww == '*'):return list(i for i in range(7))else:dset = []wws = ww.split(',')for w in wws:if (len(w.split('-')) != 1):s, e = w.split('-')for i in range(w_string2int(s), w_string2int(e) + 1):dset.append(i)dset = list(set(dset)) # 去重,如果出现3,1-5的情况避免重复输出3else:dset.append(w_string2int(w))dset = list(set(dset))return dsetdef check(ymhdmw):#检查给定的开始时间和事件进行的时间之间是否是包含的关系normal = []for X in ymhdmw:year, mon_day, hour_min, weekday, com = X# 检查是否在设置的时间范围内time = year * 100000000 + mon_day * 10000 + hour_min#标准化if (time < start or time >= end):continue# 检查每个月的日期数是否正常if ((year % 4) == 0):#闰年daysbefore = sum(Days_of_mons_in_leap_year[0:mon_day // 100 - 1])#计算到前一个月总共有多少天,比如:1116,计算的就是从1月到10月总共的天数if (Days_of_mons_in_leap_year[mon_day // 100 - 1] < (mon_day % 100)):continueelse:#不是闰年daysbefore = sum(Days_of_month[0:mon_day // 100 - 1])if (Days_of_month[mon_day // 100 - 1] < (mon_day % 100)):continue# 检查星期数是否正常years_from_1970 = year - 1970#1940到输入的年份有多少年num_of_leap_year = (years_from_1970 + 1) // 4#计算1970年之后有多少个闰年days_from_197011 = years_from_1970 * 365 + num_of_leap_year + daysbefore + mon_day % 100 - 1#计算1970年1月1日至输入的那天有多少天if (((days_from_197011 % 7) + 4) % 7 == weekday):#题目给了1976年1月1日是周四,接下来推算即可,可以判断某年某月某日是不是某星期normal.append([time, command])#将判断符合逻辑的时间和命令写入列表return normaln, start, end = list(map(int, input().split()))
crontab = []
startyear = start // 100000000
endyear = end // 100000000
for i in range(n):minutes, hours, day_of_month, month, dayofweek, command = input().split()minhoueset = MMHH(minutes, hours)daymonset = ddmm(day_of_month, month)week = day_of_week(dayofweek)ymhdmw = []for i in range(startyear, endyear + 1):for mh in minhoueset:for dm in daymonset:for w in week:ymhdmw.append([i, dm, mh, w, command])crontab.append(check(ymhdmw))
crontab1 = []
for X in crontab:for x in X:crontab1.append(x)
crontab2 = sorted(crontab1, key=lambda x: x[0])
for i in crontab2:print(i[0], i[1])
总结

相关文章:
CCF CSP认证 历年题目自练Day47
题目 试题编号: 201712-3 试题名称: Crontab 时间限制: 10.0s 内存限制: 256.0MB 样例输入 3 201711170032 201711222352 0 7 * * 1,3-5 get_up 30 23 * * Sat,Sun go_to_bed 15 12,18 * * * have_dinner 样例输出 201711170…...
LeetCode Hot100之十:239.滑动窗口最大值
题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 提示: 1 < nums.length < 10^5 -10^4 < nums[i…...
x264、x265、OpenH264 简要对比
一: x264、x265、OpenH264,都是开源代码库;二: H264(MPEG-4/AVC)、H265(HEVC),是视频编码格式。是视频标准; H264(MPEG-4/AVC) 简称: H264 或 AVC; H265(HEVC) 简称: H265 …...
二维码智慧门牌管理系统升级解决方案:门牌聚合,让管理更便捷!
文章目录 前言一、传统门牌管理系统的瓶颈二、地图门牌聚合展示的优势三、地图门牌聚合展示的实现方法四、智慧门牌管理系统的未来发展 前言 随着城市的发展和建设,对于地址信息的管理变得越来越重要。而智慧门牌管理系统作为管理地址信息的重要工具,其…...
物联网AI MicroPython学习之语法UART通用异步通信
学物联网,来万物简单IoT物联网!! UART 介绍 模块功能: UART通过串行异步收发通信 接口说明 UART - 构建UART对象 函数原型:UART(id, baudrate,bits, parity,stop, tx, rx)参数说明: 参数类…...
Git企业开发级讲解(四)
📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、理解分⽀二、创建分支三、切换分⽀四、合并分⽀五、删除分⽀六、合并冲突七、分⽀管理策略…...
pytorch 安装 2023年
pytorch网址:https://pytorch.org/get-started/locally/ conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia我在自己电脑上用这个pip命令完全安装不了,只能用conda安装。复制上面提供的命令,在cmd中直接运…...
人工智能基础_机器学习040_Sigmoid函数详解_单位阶跃函数与对数几率函数_伯努利分布---人工智能工作笔记0080
然后我们再来详细说一下Sigmoid函数,上面的函数的公式 我们要知道这里的,Sigmoid函数的意义,这逻辑斯蒂回归的意义就是,在多元线性回归的基础上,把 多元线性回归的结果,缩放到0到1之间对吧,根据中间的0.5为分类,小于0.5的一类,大于的一类, 这里的h theta(x) 就是概率函数 然…...
Scala---迭代器模式+Trait特质特性
Scala迭代器模式处理数据 scala中创建集合需要内存,集合与集合之间的转换时,每次转换生成新的集合时,新的集合也需要内存。如果有一个非常大的初始集合,需要经过多次转换,每次转换都生成一个新的集合,才能…...
labview运行速度太慢
找到labview程序运行速度的瓶颈 - 百度文库 LabVIEW执行速度 - 北京瀚文网星科技有限公司 性能和内存信息窗口 必需:基础版开发系统 选择工具性能分析性能和内存,可显示该窗口。 该窗口用于采集和显示VI的执行时间和内存使用信息。如在不属于项目的…...
QT基础入门【QSS】继承、命名空间中的小部件、QObject 属性介绍
继承 在经典 CSS 中,当项目的字体和颜色没有显式设置时,它会自动从父级继承。但是在使用 Qt 样式表时,默认情况下,部件不会从其父部件自动继承其字体和颜色设置。 例如,考虑一个 QPushButton 在 QGroupBox 内部: qApp->setStyleSheet("QGroupBox { color: red…...
Ubuntu18.04安装IgH主站
EtherCAT主站是EtherCAT网络中的中央控制单元,负责协调和管理连接到网络的所有从站设备。EtherCAT(Ethernet for Control Automation Technology)是一种高性能、实时的工业以太网通信协议,广泛应用于自动化和控制领域。 一、安装依赖包 sudo apt install autoconf automa…...
HTML5-原生History
更多内容,访问: history hash 单页面应用和多页面应用 React-Router源码分析-History库 History库源码分析-Action 动作类型 History库源码分析-createLocation History库源码分析-createPath History库源码分析-parsePath history 浏览器历史记录对象 属性: le…...
无需公网IP,使用MCSM面板一键搭建我的世界Minecraft服务器联机游戏
文章目录 前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口 5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址 7. 使用固定公网地址远程联机 前言 MCSManager是一个…...
高斯积分-Gaussian Quadrature
https://mathworld.wolfram.com/GaussianQuadrature.html...
Linux下非root用户安装CUDA
目录 前言 参考链接 步骤 一. 首先,需要查看系统版本: 二. 安装包下载。 下载CUDA: cuDNN下载 三. 开始安装CUDA和cuDNN 安装CUDA 修改环境变量 安装 cuDNN 查看是否安装成功,输入nvcc -V 前言 由于一些代码实现&…...
【bugfix】安装 flash-attn 报错
目录 1. 报错信息 2. 解决方法 安装 flash attention 报错 1. 报错信息 Building wheel for flash-attn (setup.py) ... error error: subprocess-exited-with-error 或者 Building wheel for flash-attn (pyproject.toml) did not run successfully 甚至更多问题。 2. 解…...
技术实践|高斯集群服务器双缺省网关故障分析
导语:当前国产化数据库使用范围越来越广泛,在GaussDB数据库的使用过程中难免会遇到一些问题,有的问题是由于在安装过程中没有注意细节而产生的,多数隐患问题都是在特定场景下才会暴露出来,且暴露的时间未知,…...
手把手教你搭建Maven私服
Java全能学习面试指南:https://javaxiaobear.cn 1. Maven私服简介 ①私服简介 Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。 当然…...
LeetCode 面试题 16.25. LRU 缓存
文章目录 一、题目二、C# 题解 一、题目 设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
