文章目录
- 字母数
- 判断列名(进制问题)
- 特殊日期
字母数
由于是填空题,那么寻找的话,就直接让每一个位置都是A,通过计算看看是不是结果大于2022即可
判断列名(进制问题)
- 这道题目,我们可以往数字进制的方面考虑的话,就可能会简单许多
- 可以理解为进制为26 的,然后给你2022,让你将2022用26 进制的符号来表示
- 对于最低位就是2022对26 的取余
- 对于次低位,就是 2022 对26 的取整然后再对26 取余
- 由于经过计算,只有三位,那么最高位就是 2022 对26进行两次的取整
对于字符的相对应的确认,我们可以先定义一个字符串,然后通过下标进行相对应的确认
import os
import sys
# 请在此输入您的代码
dic = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
a = 2022
print(dic[2022//(26*26)-1] + dic[(2022//26)%26-1] + dic[2022%26-1])
特殊日期
- 这一题就只有枚举的暴力算法了,不过怎么进行枚举,如何避免超时就是我们要考虑的问题
- 由于涉及年月日,三个不同的时期,有人就会考虑,能否使用一个三层循环?结果是肯定不行的。然后又有一个问题,就是如何对于不同的月份的 天数不一样的问题,难道要在循环里面添加多个i f 来判断吗?然后就是是否将闰年分开讨论?如何很好解决计算一个数字各个数位的数字之和?
- 对于上述的问题:
1.对于信息的存储:我们可以使用列表来存储,然后最后的一个查询的问题就可以使用字典(字典有一个和好处:就是当键不存在时,就会以你输入的键进行创建
)- 对于重复使用并且可以单独的功能,我们就把该功能单独写成函数进行后续的一个调用
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)