一、题目描述
思路:
1、统计2000年到2000000年的日期,肯定是需要遍历
2、闰年的2月是29天,非闰年的2月是28天。我们需要判断这一年是否是闰年。
1、3、5、7、8、10、12月是31天,4、6、9、11月是30天。
3、年份yy是月份mm的倍数也是dd的倍数:说明年份yy对月份mm和dd要同时整除
4、因为是一道填空题,我们可以不考虑算法的时间和空间复杂度的限制,使用暴力直接解决。
代码
import os
import sys
# 请在此输入您的代码
def isLeap(x): # 判断是否为闰年
if (x % 4 == 0 and x % 100 != 0) or x % 400 == 0:
return True
return False
def numAdd(x): # 计算年份个数位的数字和
sums = 0
while x:
sums += x % 10
x //= 10
return sums
start, end = 1900, 9999
ans = 0
day = [1, -2, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1] # 每个月天数和30天的差值
data = []
hstable = dict() # key:月份1~12,value:每个月份月份数位和+日的数位和的区间,如1月份为(2, 32)
for j in range(1,32): # 计算日数位和
data.append(numAdd(j))
for i in range(1, 13): # 初始化哈希表
t = numAdd(i) # 月数位和
for j in range(day[i - 1] + 30): # 遍历一个月的每一天将月数位和加上日数位和
addt = t + data[j]
if addt not in hstable:
hstable[addt] = 1
else:
hstable[addt] += 1 # 哈希表中对应的天数加一
for i in range(start, end + 1): # 遍历每一年
yearsum = numAdd(i) # 计算年的数位和
if yearsum in hstable: # 若年的数位和在哈希表中存在则答案加上对应的天数
ans += hstable[yearsum]
if isLeap(i) and yearsum == 13: # 闰年2月份多一天,位数和为13
ans += 1
print(ans)
本来想自己尝试写一下,但是结果不对,还是先学习一下大佬的吧。因为清明节放假,根本不想学习,玩完之后有戒断反应,非常失落现在。唉,还有六天就到省赛了,咱们就是说顺其自然吧,我已经不抱希望获奖了哈哈,自己的能力还是不够,还是要多学习啊。学习的过程比结果更重要!(好吧只能这样安慰自己了)