下一次对称日期是几号?

20211202

今天是2021年12月2日-20211202,是一个多年难遇的对称日期。为了纪念这有意义的日子,大鹏临时写了一个代码,来根据当天,算下一个回文的日期。好家伙,8年一遇,开撸!

代码不难,主要在这体现一个良好的(自认为)开发习惯。

分析

需求

先理顺下本次的需求:根据输入的日期,来得出下一次的回文(对称)日期:

  1. 输入的日期是8位;

  2. 输出回文日期;

输出的回文日期需要什么条件?

  • 判断一个日期是否是回文串

  • 判断日期是否合法,合法的判断条件是:月份范围在1-12,天数则根据闰年和非闰年确定。

步骤

1. 万事先开始main函数,先写框架后写细节的思想不能丢:

2. 接着写回文函数,在这个函数里不做逻辑判断,只管输出:

  • 传入当前日期的下一天,这里有两种做法,py的话当然可以int强转后+1: data_date = str(int(data)+1);还可以对字符串切分后(用除法或取余取数),再1000×a+100×b+10×c的方式拼接。

  • 循环从当前日期的下一天开始往下遍历,如果合法且回文,则返回,否则继续

3. 开始判断函数,判断函数主要两块-回文且合法:

  • 回文的判断,对称的字符相同。做法是遍历字符串,以当前index和长度-index-1的位置值进行判断:

  • 月份的判断:把月份(第5,6位)拆出来,需要在12内;

  • 天的判断:根据是否为闰年来进行判断。这里我开始做了一个数组,把闰年和非闰年的每个月的天数列出,再判断闰年和非闰年,根据月份进行匹配。闰年的判断方式是:年份整除4且不能整除100,或者可以整除400:

代码

最后代码如下

def fun(data_date):
    leap_month = ([0,31,29,31,30,31,30,31,31,30,31,30,31],[0,31,28,31,30,31,30,31,31,30,31,30,31])
    for i in range(len(data_date)):
        if data_date[i] != data_date[len(data_date)-i-1]:
            return False
    year,mounth, day = int(data_date[:4]), int(data_date[4:6]), int(data_date[-3:-1])
    if mounth > 12: return False
    index = 0 if (year%4==0 and year%100!=0) or year%400==0 else 1
    if(day>leap_month[index][mounth]): return False
    return True
def palindrome(data):
    flag = 0
    data_date = str(int(data)+1)
    while True:
        if flag == 1: break
        if not fun(data_date):
            data_date = str(int(data_date)+1)
            continue
        else:
            return data_date

if __name__ == '__main__':
    data = input("输入一个日期:")
    res = palindrome(data)
    print('之后的回文日期:' + res)

我是精神抖擞王大鹏,不卑不亢,和蔼可亲~
计算机硕士,目前小米大数据开发。日常会分享总结一些自己面试实际问题的回答,欢迎一起讨论。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

精神抖擞王大鹏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值