• 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

  • 相关阅读:
    Day50.算法训练
    【JavaScript 20】String对象 构造函数 工具方法 静态方法 实例属性 实例方法
    明解STM32—GPIO理论基础知识篇之寄存器原理
    移动端实现HTML5 mp3录音踩坑指南:系统播放音量变小、一些机型录音断断续续 之 MediaRecorder和AudioWorklet的终极对决
    【JavaSE专栏20】浅谈Java中的正则表达式的应用场景
    Win11任务栏太宽了怎么变窄?Win11任务栏宽度调整方法
    Kubernetes调度
    【DIY飞控板PX4移植】BARO模块BMP388气压计的PCB硬件设计和PX4驱动配置
    Linux系统编程_网络编程:字节序、socket、server&client、ftp 云盘
    Spring Bean
  • 原文地址:https://blog.csdn.net/qq_47991812/article/details/127822241