题解:蓝桥云课 498 回文日期

【题目来源】

蓝桥云课:1.回文日期 - 蓝桥云课

【题目描述】

\(2020\) 年春节期间,有一个特殊的日期引起了大家的注意:\(2020\)\(2\)\(2\) 日。因为如果将这个日期按“yyyymmdd"的格式写成一个 \(8\) 位数是 \(20200202\), 恰好是一个回文数。

我们称这样的日期是回文日期。

有人表示 \(20200202\) 是“千年一遇”的特殊日子。对此小明很不认同,因为不到 \(2\) 年之后就是下一个回文日期:\(20211202\)\(2021\)\(12\)\(2\) 日。

也有人表示 \(20200202\) 并不仅仅是一个回文日期, 还是一个ABAB BABA型的回文日期。对此小明也不认同, 因为大约 \(100\) 年后就能遇到下一个ABAB BABA型的回文日期:

\(21211212\)\(2121\)\(12\)\(12\)日。算不上“千年一遇",顶多算“千年两遇"。

给定一个 \(8\) 位数的日期, 请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。

【输入】

输入包含一个八位整数\(N\),表示日期。

对于所有评测用例,\(10000101≤N≤89991231\),保证 \(N\) 是一个合法日期的 \(8\) 位数表示。

【输出】

输出两行, 每行 \(1\) 个八位数。第一行表示下一个回文日期, 第二行表示下一个ABABBABA型的回文日期。

【输入样例】

20200202

【输出样例】

20211202
21211212

【算法标签】

《蓝桥 498 回文日期》 #2020# #模拟# #构造# #省赛#

【解题思路】

image

【代码详解】

import datetime  # 使用内置日期库(避免进行日期有效性判断)
n = input()  # 输入n
y = int(n[:4])  # 字符串截取出年月日
m = int(n[4:6])
d = int(n[6:8])
dd = datetime.date(y, m, d)  # 生成日期
flag = True  # 定义标记位,方便一次循环搞定2次输出
for i in range(1, 89991231):  # 无穷遍历
    dd = dd+datetime.timedelta(1)  # 每次循环日期加1
    dd1 = str(dd).replace('-','')  # 将其转为字符串
    if dd1 == dd1[::-1]:  # 如果是回文串(python特有表达方式)
        if flag:  # 输出异常后标记修改为False,即不再输出(如果分2次输出,最后一个测试点无法通过)
            print(dd1)
            flag=False
        if dd1[0]==dd1[2]==dd1[-1]==dd1[-3] and dd1[1]==dd1[3]==dd1[-2]==dd1[-4]:  # 如果符合ABABBABA
            print(dd1)  # 输出
            break

【运行结果】

20200202
20211202
21211212
posted @ 2026-03-04 10:45  团爸讲算法  阅读(1)  评论(0)    收藏  举报