20211202
今天是2021年12月2日-20211202,是一个多年难遇的对称日期。为了纪念这有意义的日子,大鹏临时写了一个代码,来根据当天,算下一个回文的日期。好家伙,8年一遇,开撸!
代码不难,主要在这体现一个良好的(自认为)开发习惯。
分析
需求
先理顺下本次的需求:根据输入的日期,来得出下一次的回文(对称)日期:
- 输入的日期是8位;
- 输出回文日期;
输出的回文日期需要什么条件?
- 判断一个日期是否是回文串
- 判断日期是否合法,合法的判断条件是:月份范围在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)
我是精神抖擞王大鹏,不卑不亢,和蔼可亲~
计算机硕士,目前小米大数据开发。日常会分享总结一些自己面试实际问题的回答,欢迎一起讨论。