大家好,我是爱学习的小蓝,欢迎交流指正~
全网最详细蓝桥杯真题+解析+代码,绝对通俗易懂,一点就通!
专治各种没资源,没思路,没代码等新手入门级BUG
在文章结尾可免费领取蓝桥杯真题PDF
🏆全文目录(1星简单 2星中等 3星困难)
⭐试题A:门牌制作
1 真题
2 解析
3 代码
⭐ 试题B:2020
1 真题
3 代码
⭐试题C:跑步锻炼
1 真题
2 解析
3 代码
⭐⭐试题D:蛇形填数
1 真题
2 解析
3 代码
⭐试题E:排序
1 真题
2 解析
3 代码
⭐试题F:成绩统计
1 真题
2 解析
3 代码
⭐试题G:单词分析
⭐⭐试题H:数字三角形
⭐⭐⭐试题I:平面划分
⭐⭐⭐试题J:装饰珠
试题A:门牌制作 1 真题
2 解析
考察题型:枚举
涉及知识点:字符串 基础语法
思路分析:
老规矩,蓝桥杯第一题送分,白给自然要全拿!
思路:遍历1到2020,把数字转换成字符串str(),调用统计方法.count()就搞定了!
3 代码
count=0 #初始化计算器为0
for i in range(1,2021): #遍历1~2020
count+=str(i).count("2") #转化成字符串,再调用count方法
print(count) #624
试题B:2020 1 真题
小蓝有一个数字矩阵,里面只包含数字 0 和 2。
小蓝很喜欢 2020,他想找到这个数字矩阵中有多少个 2020 。
小蓝只关注三种构成 2020 的方式:
• 同一行里面连续四个字符从左到右构成 2020。
• 同一列里面连续四个字符从上到下构成 2020。
• 在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。
例如,对于下面的矩阵:
2 2 0 0 0 0
0 0 0 0 0 0
0 0 2 2 0 2
0 0 0 0 0 0
0 0 0 0 2 2
0 0 2 0 2 0
一共有 5 个 2020。
其中 1 个是在同一行里的,1 个是在同一列里的,3 个 是斜线上的。
小蓝的矩阵比上面的矩阵要大,由于太大了,他只好将这个矩阵放在了一个文件里面,在试题目录下有一个文件 2020.txt,里面给出了小蓝的矩阵,请问有多少个2020?
2 解析
难度系数:⭐⭐
考察题型:枚举
涉及知识点:搜索
思路分析:
事先说明一下,下面代码用测试案例举个栗子~学会了方法,再多的数据也不怕。
根据题目给出的三种方法遍历搜索2020。
按行,按列,按对角线,一个个枚举就完事了。
3 代码
#题解2020
nums=[["2","2","0","0","0","0"],
["0","0","0","0","0","0"],
["0","0","2","2","0","2"],
["0","0","0","0","0","0"],
["0","0","0","0","2","2"],
["0","0","2","0","2","0"]]
ans=0 #计数器
#同一行遍历查找
for i in range(len(nums)):
for j in range(len(nums)-3):
if nums[i][j]=="2" and nums[i][j+1]=="0" and nums[i][j+2]=="2" and nums[i][j+3]=="0":
ans+=1
#同一列遍历查找
for i in range(len(nums)-3):
for j in range(len(nums)):
if nums[i][j]=="2" and nums[i+1][j]=="0" and nums[i+2][j]=="2" and nums[i+3][j]=="0":
ans+=1
#对角线遍历查找
for i in range(len(nums)-3):
for j in range(len(nums)-3):
if nums[i][j]=="2" and nums[i+1][j+1]=="0" and nums[i+2][j+2]=="2" and nums[i+3][j+3]=="0":
ans+=1
print(ans)#5
试题C:跑步锻炼 1 真题
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑1千米。
如果某天是周一或者月初(1日),为了激励自己,小蓝要跑2千米。
如果同时是周一或月初,小蓝也是跑2千米。
小蓝跑步已经坚持了很长时间,从2000年1月1日周六(含)到2020年10月1日周四(含)。
请问这段时间小蓝总共跑步多少千米?
2 解析
难度系数:⭐⭐
考察题型:枚举
涉及知识点:datetime日期模块
思路分析:
咋一看题目,竟然考日期,心想:芭比Q了!datetime中的常考函数
可能全忘光了。
身为小菜鸟的我,自觉地在菜鸟教程里查阅了
亿下日期模块QAQdatetime.datetime(year="",month="",day="") #传入时间参数,返回时间格式的变量
datetime.timedelta(days="") #返回参数对应的时间间隔,作用是可以进行时间加减
datetime.weekday() #判断星期几,注意星期一返回0,星期二返回1,以此类推
直接看函数定义
可能看不懂,结合楼下代码一起食用更助于消化哦~有的小伙伴说,考试的时候不能上网,搜不到函数肿么办?
其实python自带了帮助文档,里面都有函数的详细注释!
具体搜索方法如图所示:
3 代码
#跑步锻炼
from datetime import datetime,timedelta #导入日期库中的日期时间和时间间隔两个模块
distance=0 #初始距离置0
start=datetime(2000,1,1) #开始时间
end=datetime(2020,10,1) #结束时间
delta=timedelta(1) #时间间隔
while start<=end: #循环遍历每一天
if start.day==1 or start.weekday()==0: #月初或周一时加两公里
distance+=2
else: #其他时间加一公里
distance+=1
start+=delta #别忘了while循环最后加上间隔
print(distance) #输出结果:8879
试题D:蛇形填数 1 真题
2 解析
难度系数:⭐⭐
考察题型:枚举 数论
涉及知识点:找规律
思路分析:
啊哈,蛇形填数,变相求贪吃蛇的长度?o_o ....还有这种 *** 作。
不慌,第一步先建立j行i列的直角坐标系,这招每道题都通用。
再给每个坐标点赋值,取值不难,从1,2,3···到n,
关键是赋值的顺序如何安排,这就需要找规律了。
我们
不难发现规律,ij坐标相加是奇数,←↓走势,
ij坐标相加是偶数,→↑走势。
BINGGO!
知识回顾:“&”符号是指按位与运算符,比如a&b,如果 a,b都为1结果为1,否则为0
3 代码
#蛇形填数
i,j,num=0,0,0 #初始化坐标和计数器
while True: #无限循环开始
num+=1 #元素递增
if i==19 and j==19: #从0遍历到19,19 相当于20行20列
break #找到元素,跳出循环
if (i+j)&1: #↙奇数(0+1)(1+0)
i+=1 #向下移↓
if j>0:
j-=1 #向左移←
else: #↗偶数(0+0)(1+1)
j+=1 #向右移→
if i>0:
i-=1 #向上移↑
print(num) #输出答案:761
试题E:排序 1 真题
小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻. 在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如, 对于字符串lan排序,只需要1次交换。
对于字符串qiao排序, 总共需要4次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要100次交换,
可是他忘了把这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对该串的字符排序,正好需要100次交换。
如果可能找到多个,请告诉小蓝最短的那个。
如果最短的仍然有多个,请告诉小蓝字典序最小的那个。
2 解析
难度系数:⭐
考察题型:数论
涉及知识点:冒泡排序 时间复杂度
思路分析:
整体思路就是不断缩小答案的范围。
1、先看题目给的条件:包含小写英文字母,没有字母重复出现,那就是在a~z里面找。
2、冒泡排序的排序交换次数有个公式:count=(n*(n-1)) / 2
题目要求交换100次,n一个个代入公式试试看,发现n=15时,count=105次,
说明最多有15个小写英文字母。
3、然后题目要求字典序最小(字典序最小就是指 a,b,c,d的顺序最小)
那就是abcdefghijklmno这15个字母。
如果倒着写:onmlkjihggedcba 它们交换成正序最多要105次。
4、那题目要求100次,那咋办呢?
手动先给它换5次,105次就变成100次了。
o向后换5次,把j换到最前面,答案就是:jonmlkihgfedcba.
3 代码
#代码验证:判断交换次数是否为100次?
s=list("jonmlkihgfedcba")
cnt=0
#冒泡排序
for i in range(len(s)-1):
for j in range(len(s)-i-1):
if s[j]>s[j+1]:
s[j],s[j+1]=s[j+1],s[j]
print(s)
cnt+=1
print(cnt)
试题F:成绩统计 1 真题
2 解析
难度系数:⭐
考察题型:枚举
涉及知识点:round()
思路分析:
这道题整体没啥难度,关键是注意
亿点小细节!(~ ̄▽ ̄)~假如最后算出来71.0%,那需要套一个四舍五入函数 round()
举个栗子:round(输入数字,小数位数) =转化结果
round(12.34,1)= 12.3
round(71.0)= 71 (小数位数默认为0)
3 代码
#枚举-成绩统计
n=int(input()) #n=7
a=[int(input()) for _ in range(n)] #a = [80, 92, 56, 74, 88, 100, 0]
jige=[i for i in a if i>=60] #jige = [80, 92, 74, 88, 100]
youxiu=[i for i in a if i>=85] #youxiu=[92, 88, 100]
print(f"{round(len(jige)/n*100)}%") #及格率 71%
print(f"{round(len(youxiu)/n*100)}%")#优秀率 43%
#f"{x}%":格式化输出 {里面放变量}外面放常数
#round():四舍五入函数 71.428→71 42.857→43
#len()/n:求平均值
#*100:后面加了%,所以前面先乘100 0.71→71
试题G:单词分析
2 解析
难度系数:⭐
考察题型:枚举
涉及知识点:排序sorted()
3 代码
#枚举-单词分析
s=list(input())
#s=['d', 'd', 'c', 'c', 'b', 'b', 'a']
ans=sorted(sorted(s),key=lambda x:s.count(x),reverse=True)[0]
#s=['b', 'b', 'c', 'c', 'd', 'd', 'a']
#第一次sorted(s):按字典序从小到大↗排序(a->b->c)
#第二次sorted(···):多次筛选排序
#key=lambda x:s.count(x):按字母出现的频率升序↗排列
#reverse=True:表示降序↘从大到小排列(默认False升序排列)
#[0]:出现最多的字母索引为零'b'
print(ans)#b
print(s.count(ans))#2
试题H:数字三角形
输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
27
2 解析
难度系数:⭐⭐
考察题型:动态规划
涉及知识点:模块
思路分析:
1.循环遍历
遇到金字塔形状数据,先构建二重for循环,遍历每个数,进行求和计算O(∩_∩)O
2.递推公式
求和一共三种情况:元素在 最左边 or 中间 or 最右边
3.打印答案
最后打印需要分类讨论,奇数和偶数。
因为题目中要求:”向左下走的次数与向右下走的次数相差不能超过1“
按这个规则自己走一下,会发现答案必然落在中间。
如果n为奇数时,最后必然走到倒数第一行中间的数 a[-1][n//2]
而如果n为偶数时,则取中间两个数的最大值 max(a[-1][n//2-1],a[-1][n//2])
3 代码
#动规-数字三角形
n=int(input())#5
a=[list(map(int,input().split())) for i in range(n)]
for i in range(1,n): #1~n-1
for j in range(i+1): #0~i
if j==0: #最左边元素只能由右上方得到
a[i][j]+=a[i-1][j]
elif j==i: #最右边元素只能由左上方得到
a[i][j]+=a[i-1][j-1]
else: #中间元素取上方相邻两个最大值
a[i][j]+=max(a[i-1][j-1],a[i-1][j])
if n&1: #奇数行,返回中间值(n%2==1)
print(a[-1][n//2])
else: #偶数行,返回中间两个的最大值
print(max(a[-1][n//2-1],a[-1][n//2])) #27
'''样例输入 样例输出
i\j 0 1 2 3 4 0 1 2 3 4
0 7 7
1 3 8 10 15
2 8 1 0 18 16 15
3 2 7 4 4 20 25 20 19
4 4 5 2 6 5 24 30 27 26 24
'''
试题I:平面划分
持续更新中······
试题J:装饰珠
持续更新中······
小蓝在这给大家拜年了!
祝看过文章的小伙伴轻轻松松拿下省一!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)