蓝桥杯日期问题

题目描述

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。

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

输入格式

一个日期,格式是”AA/BB/CC”。

即每个’/’隔开的部分由两个 0-9 之间的数字(不一定相同)组成。

输出格式

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

数据范围

0≤A,B,C≤9

输入样例:

02/03/04

输出样例:

2002-03-04

2004-02-03

2004-03-02

问题分析:

根据题目中的输入输出,年份应该为第一个或第三个,如果是第一个,则按顺序即为年月日,如果是第三个,则有两种可能,要不第一个和第二个分别为月日,要不第一个和第二个分别为日月,将所有可能的年月日储存在一起,然后进行排序,按顺序格式化输出,即可以解决问题。

算法分析:

parse_date(date_str) 函数用于将用户输入的日期字符串解析为多个可能的日期,并以列表形式返回。- 首先,使用 split 方法将日期字符串拆分成三个部分(年、月、日)。- 然后,通过比较 cc 的大小,判断 cc 代表的是年份的十位还是个位,并设置可能的年份。- 接下来,遍历可能的年份,尝试以不同的格式("MM/DD/YYYY" 和 "DD/MM/YYYY")解析日期。- 如果解析成功,则将日期添加到 possible_dates 列表中。- 最后,对 possible_dates 列表进行排序,并将排序后的日期以字符串形式返回。

main() 函数是程序的主入口点。- 首先,接收用户输入的日期字符串。- 然后,调用 parse_date 函数将日期字符串解析为可能的日期列表。- 最后,通过循环遍历打印可能的日期。

空间复杂度:parse_date 函数使用了一个列表 possible_dates 来存储可能的日期。由于最多可能有 100 年的年份和两种日期格式,因此最多可能存储 100 * 2 = 200 个日期。因此,空间复杂度为 O(200)。

时间复杂度:parse_date 函数的时间复杂度主要取决于遍历可能的年份和尝试不同的日期格式。由于需要遍历从 1900 年到 2059 年的年份,以及尝试两种日期格式,因此时间复杂度为 O(100 * 2) = O(200)

完整代码:

import datetime
def parse_date(date_str):
    # 使用split方法将日期字符串拆分成三个部分
    parts = date_str.split('/')

    # 获取输入日期的三个部分
    aa = int(parts[0])
    bb = int(parts[1])
    cc = int(parts[2])

    # 初始化一个空列表来存储可能的日期
    possible_dates = []
    if aa>59:
        year = 1900 + aa
        date = datetime.date(year, bb, cc)
        possible_dates.append(date)
    else:
        year = 2000 + aa
        date = datetime.date(year, bb, cc)
        possible_dates.append(date)

    # 计算年份
    # 通过比较cc的大小,判断cc代表的是年份的十位还是个位
    if cc > 59:
        year_options = [1900 + cc]
    else:
        year_options = [2000 + cc]

    # 遍历所有可能的年份,计算可能的日期
    for year in year_options:
        try:
            # 尝试以"MM/DD/YYYY"的格式解析日期
            date = datetime.date(year, aa, bb)
            possible_dates.append(date)
        except ValueError:
            pass

        try:
            # 尝试以"DD/MM/YYYY"的格式解析日期
            date = datetime.date(year, bb, aa)
            possible_dates.append(date)
        except ValueError:
            pass


    # 对可能的日期进行排序
    possible_dates.sort()

    # 将可能的日期以字符串形式输出
    formatted_dates = [date.strftime("%Y-%m-%d") for date in possible_dates]

    return formatted_dates


def main():
    # 接收用户输入的日期
    date_str = input("请输入日期(格式为AA/BB/CC):")

    # 调用解析函数,将日期转换为指定的格式
    possible_dates = parse_date(date_str)

    # 输出可能的日期
    for date in possible_dates:
        print(date)
if __name__ == "__main__":
    main()

运行结果:

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

实沈-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值