• python,回文日期【第十一届】【省赛】【研究生组】


    代码和详细思路在结尾,核心思路如下:

    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后,为了与初始日期比较,将其和月份、天数转为一个整数,将两个整数的比较作为日期靠前靠后的凭证,
    #避免了用两个列表比较的复杂

    1. #将输入的字符串转为为整型列表。且切片提取出年、月、日
    2. x = list(input())
    3. timee = [int(_) for _ in x]#这里‘_’等价于'x',是一个常规变量符号
    4. y = timee[0:4]#年
    5. m = timee[4:6]#月
    6. d = timee[6:8]#日
    7. #先判断以下是否为闰年,因为闰年二月有29天,平年有28天
    8. monthh = [0,31,28,31,30,31,30,31,31,30,31,30,31]#初始每一个月的天数
    9. year = (y[0]*1000+y[1]*100+y[0]*10+y[1])
    10. if year % 4==0 and year % 100 or year % 400 == 0:#闰年
    11. monthh[2] = 29#闰年二月29天
    12. else:#平年
    13. monthh[2] = 28#平年二月28天
    14. #处理开始
    15. minn1 = 1e10#初始找出最小的回文日期,跟新后作为最后的结果1
    16. minn2 = 1e10#初始找出最小的ABABBABA样式的,更新后作为最后的结果2
    17. #将列表日期,转为为数值型数据,如x = [2,0,2,0,0,2,0,2] 转化为一个值为20200202的整数,int(1e7)等价于1后7个零即:10000000,后面同理转为一个整数。
    18. #先把初始输入的日期转为一个整数
    19. 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]
    20. #循环总目的是,模拟月份和号,思路是在符合回文要求的数中选择最小的,只关心满足回文条件的数
    21. for i in range(1,12+1):#月份i取值[1,2...,12]
    22. for j in range(1,monthh[i]+1):#天数j取值[1,2...,monthh[i]],这里的monthh[i]是上文经过闰年判断后的数组
    23. #先将月份、号数这两个整数转化为列表,因为方便推出年数(因为思路是在符合回文要求的数中选择最小的,故我们只关心满足回文条件的数)
    24. #例如12,31则有idex= [2,1],jdex = [1,3]
    25. idex=[i%10,int(i/10)];#[2,1]
    26. jdex=[j%10,int(j/10)];#[1,3]
    27. #因为只关心满足回文的数,故此时可以推出年份为1321,总为13211231
    28. #得到idex、jdex后,为了与初始日期比较,将其和月份、天数转为一个整数,将两个整数的比较作为日期靠前靠后的凭证,
    29. #避免了用两个列表比较的复杂
    30. size = jdex[0] * int(1e7) + jdex[1] * int(1e6)+ idex[0] * int(1e5)+idex[1] * int(1e4)+ i * 100 + j
    31. #只关注大于初始日期的,
    32. if size > yymmdd:
    33. #判断,找出最小的回文日期
    34. if size <= minn1:
    35. minn1 = size
    36. #判断,找出最小的ABABBABA样式的
    37. if idex[1] == jdex[1] and idex[0] == jdex[0] and size <= minn2:
    38. minn2 = size
    39. else:#若在初始日期之前的日期,则不管
    40. pass
    41. #print result
    42. print(minn1,minn2,sep='\n')
    43. #test 样例
    44. #20200202

  • 相关阅读:
    (九)DFI接口时序
    1、JVM:什么是JVM?
    恢复二叉搜索树[根据题意模拟->发现问题->分析问题->见招拆招]
    5 分钟完成 ZooKeeper 数据迁移
    Redis 数据迁移篇之redis-shake工具使用手册
    Spring依赖注入之@autowire注解详解
    蓝桥杯刷题(一)
    C# XML基础入门(XML文件内容增删改查清)
    博科交换机使用
    2022-32周 项目问题整理
  • 原文地址:https://blog.csdn.net/qq_47991812/article/details/127822241