【蓝桥杯】43693.日期问题

ops/2025/1/22 20:00:09/

题目描述

  小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。

  更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。

  给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入描述

一个日期,格式是 “AA/BB/CC” (0≤A,B,C≤9)。

输出描述

  输出若干个不相同的日期,每个日期一行,格式是 “yyyy−MM−dd”。多个日期按从早到晚排列。

输入输出样例

示例

输入:

02/03/04

输出:

2002-03-04
2004-02-03
2004-03-02

题目分析

  比较简单,无非就是分情况讨论而已。第一种情况:"年 / 月 / 日"的格式;第二种情况:"月 / 日 / 年"的格式;第三种情况:"日 / 月 / 年"的格式;
  年份的区间在1960年至2059年,跨度100年,其中 y e a r year year >= 60的,是19开头的年份, y e a r year year < 60的,是20开头的年份;月份的区间在01月到12月;日期的区间在01日到31日。根据输入的字符串,做拆分之后,寻找可能的组合即可。
  但是有几个限制规则需要注意:

  1. 2月没有30日和31日,闰年可以有29日,不是闰年只有01-28日。
  2. 对于 4、6、9、11 月的天数不能超过 30 天。

代码实现

感谢 @练洋洋 同学提供的代码。不过在这个版本的代码中没有判断闰年和判断单双月最后一天的功能。

python">import os
import sys
import datetimedef is_valid_date(year, month, day):"""此函数用于判断输入的年、月、日是否为有效的日期,并检查是否在 1960 年 1 月 1 日至 2059 年 12 月 31 日之间:param year: 年份:param month: 月份:param day: 日期:return: 若为有效日期且在指定范围内返回 True,否则返回 False"""try:# 使用 datetime.date 类尝试创建日期对象date = datetime.date(year, month, day)# 检查日期是否在 1960 年 1 月 1 日至 2059 年 12 月 31 日之间if datetime.date(1960, 1, 1) <= date <= datetime.date(2059, 12, 31):return Trueelse:return False# 若输入的年、月、日组合不合法会引发 ValueError 异常except ValueError:return False# 从标准输入读取日期字符串,并使用 map 函数将其按 / 分割并转换为整数存储在 a, b, c 中
a, b, c = map(int, input().split('/'))
# 存储满足条件的日期元组列表
dates = []# 假设日期格式为年/月/日
if 1 <= b <= 12 and 1 <= c <= 31:# 如果年份前两位大于等于 60,则年份是 19xx 年if a >= 60:# 调用 is_valid_date 函数判断日期是否有效if is_valid_date(1900 + a, b, c):dates.append((1900 + a, b, c))# 否则年份是 20xx 年else:if is_valid_date(2000 + a, b, c):dates.append((2000 + a, b, c))# 假设日期格式为月/日/年
if 1 <= a <= 12 and 1 <= c <= 31:# 对年份的处理,根据 c 的大小判断是 19xx 年还是 20xx 年if c >= 60:if is_valid_date(1900 + c, a, b):dates.append((1900 + c, a, b))else:if is_valid_date(2000 + c, a, b):dates.append((2000 + c, a, b))# 假设日期格式为日/月/年
if 1 <= a <= 31 and 1 <= b <= 12:# 对年份的处理,根据 c 的大小判断是 19xx 年还是 20xx 年if c >= 60:if is_valid_date(1900 + c, b, a):dates.append((1900 + c, b, a))else:if is_valid_date(2000 + c, b, a):dates.append((2000 + c, b, a))# 对 dates 列表去重
dates = list(set(dates))
# 对日期列表进行排序,排序依据是元组中的元素,即年、月、日
dates.sort()
# 遍历排序后的日期列表,将其按照指定格式输出
for date in dates:print('{:04d}-{:02d}-{:02d}'.format(date[0], date[1], date[2]))

修改之后的代码,加入了非闰年天数不超过28天以及部分月份天数不能超过 30 天的限制,要更加合理一些:

python">import os
import sys
import datetimedef is_valid_date(year, month, day):"""此函数用于判断输入的年、月、日是否为有效的日期,并检查是否在 1960 年 1 月 1 日至 2059 年 12 月 31 日之间:param year: 年份:param month: 月份:param day: 日期:return: 若为有效日期且在指定范围内返回 True,否则返回 False"""# 定义大月的月份集合big_months = {1, 3, 5, 7, 8, 10, 12}# 定义小月的月份集合small_months = {4, 6, 9, 11}try:if month == 2:# 判断是否为闰年if (year % 4 == 0 and year % 100!= 0) or (year % 400 == 0):if 1 <= day <= 29:date = datetime.date(year, month, day)if datetime.date(1960, 1, 1) <= date <= datetime.date(2059, 12, 31):return Trueelse:return Falseelse:if 1 <= day <= 28:date = datetime.date(year, month, day)if datetime.date(1960, 1, 1) <= date <= datetime.date(2059, 12, 31):return Trueelse:return Falseelif month in big_months:if 1 <= day <= 31:date = datetime.date(year, month, day)if datetime.date(1960, 1, 1) <= date <= datetime.date(2059, 12, 31):return Trueelse:return Falseelif month in small_months:if 1 <= day <= 30:date = datetime.date(year, month, day)if datetime.date(1960, 1, 1) <= date <= datetime.date(2059, 12, 31):return Trueelse:return Falseelse:return Falseexcept ValueError:return Falsedef main():# 从标准输入读取日期字符串,并使用 map 函数将其按 / 分割并转换为整数存储在 a, b, c 中a, b, c = map(int, input().split('/'))# 存储满足条件的日期元组列表dates = []# 假设日期格式为年/月/日if 1 <= b <= 12 and 1 <= c <= 31:# 如果年份前两位大于等于 60,则年份是 19xx 年if a >= 60:# 调用 is_valid_date 函数判断日期是否有效if is_valid_date(1900 + a, b, c):dates.append((1900 + a, b, c))# 否则年份是 20xx 年else:if is_valid_date(2000 + a, b, c):dates.append((2000 + a, b, c))# 假设日期格式为月/日/年if 1 <= a <= 12 and 1 <= c <= 31:# 对年份的处理,根据 c 的大小判断是 19xx 年还是 20xx 年if c >= 60:if is_valid_date(1900 + c, a, b):dates.append((1900 + c, a, b))else:if is_valid_date(2000 + c, a, b):dates.append((2000 + c, a, b))# 假设日期格式为日/月/年if 1 <= a <= 31 and 1 <= b <= 12:# 对年份的处理,根据 c 的大小判断是 19xx 年还是 20xx 年if c >= 60:if is_valid_date(1900 + c, b, a):dates.append((1900 + c, b, a))else:if is_valid_date(2000 + c, b, a):dates.append((2000 + c, b, a))# 对 dates 列表去重dates = list(set(dates))# 对日期列表进行排序,排序依据是元组中的元素,即年、月、日dates.sort()# 遍历排序后的日期列表,将其按照指定格式输出for date in dates:print('{:04d}-{:02d}-{:02d}'.format(date[0], date[1], date[2]))if __name__ == "__main__":main()

http://www.ppmy.cn/ops/152263.html

相关文章

Apache Hive 聚合函数与 OVER 窗口函数:从基础到高级应用

在大数据时代&#xff0c;Apache Hive 是处理和分析海量数据的强大工具。Hive 提供了丰富的聚合函数和强大的 OVER 窗口函数&#xff0c;能够帮助我们高效地进行数据分析。本文将综合介绍 Hive 的聚合函数和 OVER 窗口函数&#xff0c;结合实际使用场景和代码示例&#xff0c;帮…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心&#xff0c;继续前行 1. 加入 CSDN 的契机 首次接触…

SQLLOADER小实验

SQLLOADER实验&#xff1a; 建立一个实验用目录&#xff1a; mkdir -p /home/oracle/sqlldr --在ORACLE用户下执行 在数据库HR用户下创建一个表&#xff1a; create table dept(deptno number(5),dname varchar2(15),loc varchar2(15)); 1&#xff09;创建数据文件 vi t…

2025web建议

随便收集的信息 新手入门路线推荐 第一步&#xff1a;Web安全相关概念 建议学习时间&#xff1a;2周 学习内容如下&#xff1a; 1、熟悉基本概念(SQL注入、上传、XSS、CSRF、一句话木马等)。 2、通过关键字(SQL注入、上传、XSS、CSRF、一句话木马等)进行Google。 3、阅读《Web…

嵌入式知识点总结 C/C++ 专题提升(一)-关键字

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.C语言宏中"#“和"##"的用法 1.1.(#)字符串化操作符 1.2.(##)符号连接操作符 2.关键字volatile有什么含意?并举出三个不同的例子? 2.1.并行设备的硬件寄存…

Flink (九):DataStream API (六) Process Function

1. ProcessFunction ProcessFunction 是一种底层的流处理操作&#xff0c;基于它用户可以访问&#xff08;无环&#xff09;流应用程序的所有基本构建块 事件&#xff08;流元素&#xff09;状态&#xff08;容错&#xff0c;一致性&#xff0c;仅在 keyed stream 上&#xf…

当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线

问题&#xff1a;当设置dialog中有el-table时&#xff0c;并设置el-table区域的滚动&#xff0c;看到el-table中多了一条横线&#xff1b; 原因&#xff1a;el-table有一个before的伪元素作为表格的下边框下&#xff0c;初始的时候已设置&#xff0c;在滚动的时候并没有重新设置…

秒鲨后端之MyBatis【2】默认的类型别名、MyBatis的增删改查、idea中设置文件的配置模板、MyBatis获取参数值的两种方式、特殊SQL的执行

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! 下篇更新&#xff1a; 秒鲨后端之MyBatis【3】自定义映射resultMap、动态SQL、MyBatis的缓存、MyBatis的逆向工程、分页插件。 默认的类型别名 MyBatis的增删改查 添加 insert into t_user va…