代码和详细思路在结尾,核心思路如下:
1.将列表日期,转为为数值型数据,如x = [2,0,2,0,0,2,0,2] 转化为一个值为20200202的整数
2.再进行数值大小的比较,确保选择的日期大于初始输入的日期(这里不能等于,因为要保证的是下一个回文日期),例如20211212 大于 20200202 显然成立,而20200201和20200202一个小于20200202一个又相等了,都不行
3.在满足日期往后选择的基础上,筛选出回文日期。
4.在筛选回文日期的途中,让上一个最小回文日期的值和当前比较,如果这个回文日期小于上一个,就更新选择最小的。(因为回文日期的值越小,说明此日期越靠前,即越接近我们的开始的日期)
5.同理ABABBABA样式的类似回文日期一样筛选,两者是独立的。但感觉可以简化有兴趣的笔友可以一试,因为ABABBABA是可以在回文日期的基础上进行的,可以不用独立联系起来。
思路更多详情在后面
以下是代码里面的注释(详细思路),也包含在了代码里:
#将输入的字符串转为为整型列表。且切片提取出年、月、日
#先判断以下是否为闰年,因为闰年二月有29天,平年有28天
#将列表日期,转为为数值型数据,如x = [2,0,2,0,0,2,0,2] 转化为一个值为20200202的整数,int(1e7)等价于1后7个零即:10000000,后面同理转为一个整数。
#先把初始输入的日期转为一个整数
#循环总目的是,模拟月份和号,思路是在符合回文要求的数中选择最小的,只关心满足回文条件的数
两个循环:
#1.月份i取值[1,2...,12]
#2.#天数j取值[1,2...,monthh[i]],这里的monthh[i]是上文经过闰年判断后的数组
#先将月份、号数这两个整数转化为列表,因为方便推出年数(因为思路是在符合回文要求的数中选择最小的,故我们只关心满足回文条件的数)
#例如12,31则有idex= [2,1],jdex = [1,3]
#因为只关心满足回文的数,故此时可以推出年份为1321,总为13211231
#得到idex、jdex后,为了与初始日期比较,将其和月份、天数转为一个整数,将两个整数的比较作为日期靠前靠后的凭证,
#避免了用两个列表比较的复杂
#将输入的字符串转为为整型列表。且切片提取出年、月、日
x = list(input())
timee = [int(_) for _ in x]#这里‘_’等价于'x',是一个常规变量符号
y = timee[0:4]#年
m = timee[4:6]#月
d = timee[6:8]#日
#先判断以下是否为闰年,因为闰年二月有29天,平年有28天
monthh = [0,31,28,31,30,31,30,31,31,30,31,30,31]#初始每一个月的天数
year = (y[0]*1000+y[1]*100+y[0]*10+y[1])
if year % 4==0 and year % 100 or year % 400 == 0:#闰年
monthh[2] = 29#闰年二月29天
else:#平年
monthh[2] = 28#平年二月28天
#处理开始
minn1 = 1e10#初始找出最小的回文日期,跟新后作为最后的结果1
minn2 = 1e10#初始找出最小的ABABBABA样式的,更新后作为最后的结果2
#将列表日期,转为为数值型数据,如x = [2,0,2,0,0,2,0,2] 转化为一个值为20200202的整数,int(1e7)等价于1后7个零即:10000000,后面同理转为一个整数。
#先把初始输入的日期转为一个整数
yymmdd = y[0] * int(1e7) + y[1] * int(1e6) + y[2] * int(1e5) + y[3]*int(1e4) + m[0]*int(1e3)+m[1]*int(1e2)+d[0]*int(1e1)+d[1]
#循环总目的是,模拟月份和号,思路是在符合回文要求的数中选择最小的,只关心满足回文条件的数
for i in range(1,12+1):#月份i取值[1,2...,12]
for j in range(1,monthh[i]+1):#天数j取值[1,2...,monthh[i]],这里的monthh[i]是上文经过闰年判断后的数组
#先将月份、号数这两个整数转化为列表,因为方便推出年数(因为思路是在符合回文要求的数中选择最小的,故我们只关心满足回文条件的数)
#例如12,31则有idex= [2,1],jdex = [1,3]
idex=[i%10,int(i/10)];#[2,1]
jdex=[j%10,int(j/10)];#[1,3]
#因为只关心满足回文的数,故此时可以推出年份为1321,总为13211231
#得到idex、jdex后,为了与初始日期比较,将其和月份、天数转为一个整数,将两个整数的比较作为日期靠前靠后的凭证,
#避免了用两个列表比较的复杂
size = jdex[0] * int(1e7) + jdex[1] * int(1e6)+ idex[0] * int(1e5)+idex[1] * int(1e4)+ i * 100 + j
#只关注大于初始日期的,
if size > yymmdd:
#判断,找出最小的回文日期
if size <= minn1:
minn1 = size
#判断,找出最小的ABABBABA样式的
if idex[1] == jdex[1] and idex[0] == jdex[0] and size <= minn2:
minn2 = size
else:#若在初始日期之前的日期,则不管
pass
#print result
print(minn1,minn2,sep='\n')
#test 样例
#20200202