最新 第十一届蓝桥杯软件类Python组(试题回忆+部分个人解答)

第二次参加蓝桥杯竞赛了,欢迎各位同学来一起交流~ 如果发现我的代码有什么问题的话,敬请指正(抱拳
PS:只记得每个题目的问题本质了,题目原文是怎么描述已经忘得差不多了 。
第一题. 贴门牌号
原问题:从1到2020中这些数字中有多少个2(注意:不是问多少个数字里有2),
解题思路:基础题不赘述了哈,好像去年C++组的第一题也是这个呢,不过用写可真香
参考代码:
ans = 0for i in range(1,2021):ans += (str(i).count('2'))print(ans)
运行结果是624
第二题. 2020
原问题:在一个给定的由数字 '0'和 '2' 组成的矩阵中寻找横向往右、纵向往下和斜向往右下的 '2020' 排列,原题中给定的矩阵是300行300列的,在一个txt文件中存放 。
解题思路:同样数据量不大,暴力就完事了,考试时我还不知道怎么用读取txt,只能在控制台手动输入,最后一行输入一个1作为结束标志 。
参考代码:
def check(s):return s == '2020'matrix = []s = input()while '1' not in s:matrix.append(list(s))s = input()n,m = len(matrix),len(matrix[0])ans = 0for i in range(n):for j in range(m):if i + 3 < n and check(matri[i][j] + matrix[i+1][j] + matrix[i+2][j] + matrix[i+3][j]):ans += 1if j + 3 < m and check(matrix[i][j:j+4]):ans += 1if i + 3 < n and j + 3 < m and check(matri[i][j] + matrix[i+1][j+1] + matrix[i+2][j+2] + matrix[i+3][j+3]):ans += 1print(ans)
当时的结果好像是16520 。。。记不太清了
第三题. 跑步
原问题:小明坚持每天跑步,正常情况下每天跑一公里,如果这一天是周一或者月初(每月的一号),那么小明就会跑两公里(如果这一天既是周一,又是月初,小明也是跑两公里),小明从2000年1月1日(周六)一直坚持到了2020年10月1日(周四),请你计算一下小明共跑了多少公里?
解题思路:就是统计2000年1月1日到2020年10月1日(包含)以来共有多少天是周一或者月初,考试的时候绞尽脑汁写得代码,结果还错了,事后看别人题解才知道还有库这个东西,我哭了 。
参考代码(事后诸葛亮):
from datetime import *start = date(2000,1,1)end = date(2020,10,2)tmp = timedelta(days = 1)ans = 0while start != end:if start.weekday() == 0 or start.day == 1:ans += 2else:ans += 1start = start + tmpprint(ans)
运行结果为8879
第四题. 蛇形排列
问题分析:在蛇形排列矩阵中,第20行第20列的数字是多少?蛇形排列方式如图所示:
蛇形排列
解题思路:在该数字的左上方有 19+19 = 38 个斜排,最后一个数是 38 * (38+1) / 2 = 741,741 + 20 = 761,如图所示:
如果非得编程求解的话:那就定义两种遍历模式,一种是有↗方向,一种是↙方向,判断行号加上列号的和是单数还是偶数,
参考代码:
i = 0j = 0num = 0while True:num += 1if i == 19 and j == 19:breakif (i+j)&1:i += 1if j > 0:j -= 1else:j += 1if i > 0:i -= 1print(num)
运行结果是761
第五题. 冒泡排序
原问题:对一个字符串,对它进行冒泡排序使其为升序,例如:对于lan,排序成 aln 需要交换一次(只能交换相邻的两个字母),对于qiao,排序成 aioq 就需要交换4次 。请找出冒泡排序时恰好需要交换100次的字符串,如果有多个字符串满足条件,则找出最短的那个,如果有多个满足条件而且还是最短的,则找出字典序最小的那个 。
问题分析:长度为 n 的降序数组的冒泡排序交换次数是 (n-1) * n / 2 次,大于等于100的第一个数是 105 = (15-1) * 15 / 2,所以最短的长度肯定是15了,再考虑到字典序最小,则答案应该就是排列而成的,字典序最小,就需要第一个字母的字典序尽可能小,然后才是第二个、第三个……,那么就把正数第六个字母提到前面,结果应该就是(当时推出来以后没有拿程序验证一下 ,心里还是很没底的)