蓝桥杯 | 特殊时间 问题 | python
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。2022 年 2 月 22 日 22:20 是一个很有意义的时间, 年份为 2022 , 由 3 个 2 和 1 个 0 组成, 如果将月和日写成 4 位, 为 0222 , 也是由 3 个 2 和 1 个 0 组 成, 如果将时间中的时和分写成 4 位,还是由 3 个 2 和 1 个 0 组成。
小蓝对这样的时间很感兴趣, 他还找到了其它类似的例子, 比如 111 年 10 月 11 日 01 : 11 ,2202 年 2 月 22 日 22:02 等等。
请问, 总共有多少个时间是这种年份写成 4 位、月日写成 4 位、时间写成 4 位后由 3 个一种数字和 1 个另一种数字组成。注意 1111 年 11 月 11 日 11:11 不算,因为它里面没有两种数字。
运行限制
最大运行时间:1s
最大运行内存: 512M
- 官方题解
# 闰年的时候2月有29天,但是29这两个数字无法构成任何合法时间,因此不用判断闰年。
day_per_month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
'''
表示日期和时刻的数字取值范围固定,对日期和时刻进行合法性检测
'''
def check_D(D): # 检查日期D(四位数)是否合法
month = D // 100
day = D % 100
if month < 1 or month > 12:
return 0
if day < 1 or day > day_per_month[month]:
return 0
return 1
def check_H(H): # 检查时刻H(四位数)是否合法
h = H // 100
m = H % 100
if h < 0 or h > 23:
return 0
if m < 0 or m > 59:
return 0
return 1
'''
枚举可能的2个数字
累计满足条件的N_D, N_H
'''
ans = 0
for a in range(10): # 枚举第一个数字
for b in range(10): # 枚举第二个数字
if a == b: # 题目要求是2个数字,1个数字时下面代码都不执行
continue
N_Y, N_D, N_H = 4, 0, 0 # 合法数量。给定2个数字的情况下,年份只有4种可能(固定)
A = [a, a, a, a] # 对4个位分别替换得到baaa,abaa,aaba,aaab
for i in range(4): # 枚举四种情况baaa,abaa,aaba,aaab
A[i] = b
number = 0 # 转换为数字
for j in A:
number = number * 10 + j
N_D += check_D(number) # 调用合法性检查
N_H += check_H(number)
# 整个4种情况合法性检查完得出这一轮满足要求的日期、时刻个数
A[i] = a # 变成b的那位恢复,方便下一次替换操作
ans += N_Y * N_D * N_H # 所有轮(枚举a和b)累加
print(ans)
- 代码过程:
a | b | A | 可能 |
---|---|---|---|
0 | 0 | ||
1 | [ 0,0,0,0 ] | [ 1,0,0,0 ] | |
[ 0,1,0,0 ] | |||
[ 0,0,1,0 ] | |||
[ 0,0,0,1 ] | |||
… | |||
9 | [ 9,0,0,0 ] | ||
[ 0,9,0,0 ] | |||
[ 0,0,9,0 ] | |||
[ 0,0,0,9 ] | |||
1 | 0 | [ 1,1,1,1 ] | [ 0,1,1,1 ] |
[ 1,0,1,1 ] | |||
[ 1,1,0,1 ] | |||
[ 1,1,1,0 ] | |||
… | … | … | … |
9 | 0 | [ 9,9,9,9 ] | [ 0,9,9,9 ] |
… | … | … | … |