1.门牌号
【问题描述】
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
解题:
num = 0
for i in range(1, 2021):
num += str(i).count('2')
print(num)
# output: 624
2.寻找2020
本题总分:5 分
【问题描述】
小蓝有一个数字矩阵,里面只包含数字 0 和 2。
小蓝很喜欢 2020,他想找到这个数字矩阵中有多少个 2020 。
小蓝只关注三种构成 2020 的方式:
• 同一行里面连续四个字符从左到右构成 2020。
• 同一列里面连续四个字符从上到下构成 2020。
• 在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。
例如,对于下面的矩阵:
220000
000000
002202
000000
000022
002020
一共有 5 个 2020。其中 1 个是在同一行里的,1 个是在同一列里的,3 个是斜线上的。
小蓝的矩阵比上面的矩阵要大,由于太大了,他只好将这个矩阵放在了一个文件里面,在试题目录下有一个文件 2020.txt,里面给出了小蓝的矩阵。
请帮助小蓝确定在他的矩阵中有多少个 2020。
解题:文件分享 (weiyun.com)
# excel 分列 countif
# answer:624
matrix = []
f = open("./2020.txt", "r") # 这里我自己建了一个文件夹,里面存的是题目给的例子
while True:
data = f.readline() # 每次取出一行数据, 不过这样确实是浪费了好多时间。。。
if data[-1] != '\n': # 最后一行数据的最后一个元素为数字【0, 2】
matrix.append(list(data))
break
else:
data = data[:-1]
a = list(data)
matrix.append(a)
f.close()
row = len(matrix) # 行
col = len(matrix[0]) # 列
count = 0
for i in range(row):
for j in range(col):
if matrix[i][j] == '2': # 取出的数据类型都是字符串所以用字符'2'
if j + 3 < col: # 查找某一行 如果最后一个元素未超出界限
if matrix[i][j] + matrix[i][j + 1] + matrix[i][j + 2] + matrix[i][j + 3] == "2020":
count += 1
if i + 3 < row: # 查找某一列 如果最后一个元素未超出界限
if matrix[i][j] + matrix[i + 1][j] + matrix[i + 2][j] + matrix[i + 3][j] == "2020":
count += 1
if i + 3 < row and j + 3 < col:# 在如果行列均未被超出,则查找斜线位置
if matrix[i][j] + matrix[i + 1][j + 1] + matrix[i + 2][j + 2] + matrix[i + 3][j + 3] == "2020":
count += 1
print(count)
# 16520
3.跑步训练
本题总分:10 分
【问题描述】
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。
如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑2千米。如果同时是周一或月初,小蓝也是跑2千米。
小蓝跑步已经坚持了很长时间,从2000年1月1日周六(含)到2020年10月1日周四(含)。
请问这段时间小蓝总共跑步多少千米?
解题:
import datetime
start = datetime.date(2000,1,1)
end = datetime.date(2020,10,1)
days = datetime.timedelta(days=1) # 用以可用于计算的一天 timedelta代表两个时间之间的时间差
res = 0
while start <= end:
if start.day == 1 or start.weekday() == 0:
res += 2
else:
res += 1
start += days
print(res)
# output: 8879
4.蛇形填空
本题总分:10 分
【问题描述】
如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。
1 2 6 7 15 …
3 5 8 14 …
4 9 13 …
10 12 …
11 …
…
容易看出矩阵第二行第二列中的数是 5。
请你计算矩阵中第 20 行第 20 列的数是多少?
解题:# 简易算法
if __name__ == '__main__':
ans, n = 1, 20
for i in range(n):
ans += i * 4
print(ans)
5.排序
本题总分:15 分
【问题描述】
小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。
在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串 lan 排序,只需要 1 次交换。
对于字符串 qiao 排序,总共需要 4 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交换,可是他忘了吧这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对该串的字符排序,正好需要 100 次交换。
如果可能找到多个,请告诉小蓝最短的那个。
如果最短的仍然有多个,请告诉小蓝字典序最小的那个。
请注意字符串中可以包含相同的字符。
解题:
6.成绩统计
时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分
【问题描述】
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。
【输入格式】
输入的第一行包含一个整数 n,表示考试人数。
接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
【输出格式】
输出两行,每行一个百分数,分别表示及格率和优秀率。
百分号前的部分四舍五入保留整数。
【样例输入】
7
80
92
56
74
88
100
0
【样例输出】
71%
43%
n=int(input())
scores=[]
jige=0
youxiu=0
for i in range(0,n):
scores.append(int(input()))
for i in range(len(scores)):
if scores[i]>=60:
jige+=1
if scores[i]>=85:
youxiu+=1
jige=format(jige/n,".2f") # # format方法可以四舍五入,但返回的是字符串形式
youxiu=format(youxiu/n,".2f")
print(f'{jige[2:]}%')
print(f'{youxiu[2:]}%')
7.单词分析
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。
【输入格式】
输入一行包含一个单词,单词只由小写英文字母组成。
【输出格式】
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。
如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
【样例输入】
lanqiao
【样例输出】
a
2
【样例输入】
longlonglongistoolong
【样例输出】
o
6
【评测用例规模与约定】
对于所有的评测用例,输入的单词长度不超过 1000。
word=input()
new_word=sorted(list(set(word)))
max_word=None
max_index=0
for i in new_word:
if max_index<word.count(i):
max_word=i
max_index=word.count(i)
print(max_word)
print(max_index)
9.数字三角形

【问题描述】
上图给出了一个数字三角形。
从三角形的顶部到底部有很多条不同的路径。
对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。
此外,向左下走的次数与向右下走的次数相差不能超过 1。
【输入格式】
输入的第一行包含一个整数 N (1 < N ≤ 100),表示三角形的行数。
下面的N 行给出数字三角形。
数字三角形上的数都是 0 至 100 之间的整数。
【输出格式】
输出一个整数,表示答案。
def cal_init_dp():
n = int(input())
triangle = [] # 存储元素 [[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]]
for _ in range(n):
inp=input()
print(inp.split())
print(map(int, inp.split()))
print(list(map(int, inp.split())))
triangle.append(list(map(int, input().split()))) # input.spilt()分割得到的是字符 列表 map 将其变为int类型
dp = [[0] * n for _ in range(n)] # 存储dp # 定义状态数组 n*n
dp[0][0] = triangle[0][0] # 初始化到第一个位置的最大值即本身
for i in range(1, n):
for j in range(i + 1):
dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j]
# 其中dp[i][j]表示为从顶点开始,走到第i行j列时能够得到的最大路径和
# 这里取i-1,j-1 i-1,j 是因为这是放在了三角形中,画图
return max(dp[-1]) # 此时未考虑左右的步数不大于1,dp的最后一行元素最大值是30
#
def cal():
n = int(input())
triangle = [] # 存储元素 [[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]]
for _ in range(n):
triangle.append(list(map(int, input().split()))) # 将字符串转换为列表
dp = [[0] * n for _ in range(n)] # 定义状态数组 n*n
dp[0][0] = triangle[0][0] # 初始化到第一个位置的最大值即本身
path = [[0] * n for _ in range(n)] # 记录到某个节点所选择的路径中,选择左边的次数和选右边的次数的差值 左加右减
for i in range(1, n): # 遍历每行
for j in range(i + 1): # 每行遍历n+1个元素(从0开始)
dp[i][j] += triangle[i][j] # 先让其加入本身
if dp[i - 1][j - 1] > dp[i - 1][j]: # 如果左上角大于右上角
path[i][j] = path[i - 1][j - 1] - 1 # 向右走-1
dp[i][j] += dp[i - 1][j - 1] # 加上之前的累积
else:
path[i][j] = path[i - 1][j] + 1
dp[i][j] += dp[i - 1][j]
ans = 0
for i in range(n):
if abs(path[-1][i]) <= 1: # 遍历最后一层,找到差值小于1的,再从里面找最大
ans = max(ans, dp[-1][i])
return ans
if __name__ == '__main__':
print(cal())