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# 题解 一、题目 设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...