欢迎各位旅行者,游玩小蓝の蓝桥城!
全文目录?
?故事开端
?第一幕 ·「数字型」
枚举数字-成绩统计⭐
?传送锚点
?思路点拨
?代码详解
枚举数字-成绩分析⭐
?传送锚点
?思路点拨
?代码详解
枚举数字-货物摆放⭐⭐
?传送锚点
?思路点拨
?代码详解
?第二幕 ·「字符型」
枚举字符-门牌制作⭐
?传送锚点
?思路点拨
?代码详解
枚举字符-单词分析⭐
?传送锚点
?思路点拨
?代码详解
枚举字符-最大乘积⭐⭐
?传送锚点
?思路点拨
?代码详解
?第三幕 ·「日期型」
模拟日期-星期几⭐
?传送锚点
?思路点拨
?代码详解
模拟日期-含2天数⭐
?传送锚点
?思路点拨
?代码详解
模拟日期-回文日期⭐⭐
?传送锚点
?思路点拨
?代码详解
?第四幕 ·「地图型」
模拟地图-灌溉⭐
?传送锚点
?思路点拨
?代码详解
模拟地图-扫雷⭐
?传送锚点
?思路点拨
?代码详解
模拟地图-图像模糊⭐
?传送锚点
?思路点拨
?代码详解
?故事尾声
?故事开端
开始刷题旅行前,小蓝先简单介绍一下景点吧~(≧∀≦)ゞ
⭐难度系数:题目后边的星星代表难度,1星是必会的简单题,2星是拉开差距的中档题。
(小Tips:暴力枚举题型一般不考3星难题,小蓝就不列出来为难友友了~)
?传送锚点:点击即可传送到蓝桥云课OJ平台,在那里可以提交你的代码进行测试。
(小Tips:第一次进入是注册页面,登入后即可传送到对应题目~)
? 思路点拨:是小蓝对解题思路的总体概述,相信聪明的你,一点就通!
(小Tips:建议小伙伴们先自己刷题,再看题解,这样记得更牢,效果更佳~)
?代码详解:这里搭配了精简的代码和详细的注释,色香味俱全!
你扑到这篇文章上?,就像饥饿的人扑到了面包上?,祝吃饱~
?第一幕 ·「数字型」
枚举数字-成绩统计⭐
?传送锚点
?思路点拨
先来一道去年的枚举真题上上手~
1、输入:建立变量n,存储输入的考试人数n,再创建列表a,存储输入的考试分数。
再创建列表b和c,存储及格人数和优秀人数。
2、计算:按照公式进行计算,及格率=及格人数➗总人数。
3、输出:格式化输出 Python format 格式化函数 | 菜鸟教程
?代码详解
#枚举数字-成绩统计n=int(input()) #考试人数a=[int(input()) for i in range(n)] #学生得分b=[i for i in a if i>=60] #及格率c=[i for i in a if i>=85] #优秀率 print("{:.0f}%".format(len(b)/n*100)) #71%print("{:.0f}%".format(len(c)/n*100)) #43%'''测试样例:a=[80, 92, 56, 74, 88, 100, 0]b=[80, 92, 74, 88, 100]c=[92, 88, 100]函数解析:len(b)/n:求平均值*100:因为后面加了%,所以前面先乘100 0.71→71"{x}%".format(x):格式化输出 x是变量, %是常量{:.0f}:保留0位小数 71.428→71 42.857→43'''
枚举数字-成绩分析⭐
?传送锚点
?思路点拨
1、输入:建立变量n,存储输入的考试人数n,再创建列表a,存储输入的考试分数。
2、计算:利用python的3个函数轻松计算:max() , min() , sum()
3、输出:跟上题一样format格式化输出,这次是保留2位小数哦~
?代码详解
#枚举数字-成绩分析n=int(input())a=[int(input()) for _ in range(n)]print(max(a)) print(min(a))print("{:.2f}".format(sum(a)/n))'''测试样例: a=[80, 92, 56, 74, 88, 99, 10]最大值: 99最小值: 10平均值:71.29函数解析:"{x}%".format(x):格式化输出 x是变量, %是常量{:.2f} :保留2位小数 71.2857->71.29'''
枚举数字-货物摆放⭐⭐
?传送锚点
?思路点拨
1、约数:先输入一个n,再筛选n的约数,存到没有元素重复的集合d里。
2、遍历:三重循环模拟长宽高,遍历每一个约数,满足条件计数器+1.
?代码详解
#枚举数字-货物摆放n=2021041820210418 #货物数量cnt=0 #count统计值赋初始值0d=set() #容器docker赋予集合属性for i in range(1,int(n**0.5)+1): #循环遍历,筛选n的约数(对n开根号可加快速度) if n%i==0: #如果可被整除,判断为约数 d.add(i) #添加约数 d.add(n//i) #添加相对应的另一个约数for i in d: #三重循环遍历容器docker里的每一个约数 for j in d: for k in d: if i*j*k==n: #满足条件 cnt+=1 #方案数+1print(cnt) #提交时直接打印即可print(2430)
?第二幕 ·「字符型」
枚举字符-门牌制作⭐
?传送锚点
?思路点拨
炒鸡简单的第一题,大家先来个开胃小菜~
1、遍历:遍历门牌编号1~2020,整数int转换成字符串str。
2、统计:count统计字符2的个数,计数器cnt+1。
?代码详解
#枚举字符-门牌制作cnt=0for i in range(1,2021): cnt+=str(i).count("2")print(cnt)#print(624)
枚举字符-单词分析⭐
?传送锚点
?思路点拨
1、输入:输入一个字符串,存在s里。
2、排序:注意有两次排序,按字典序排序,和单词出现的频率排序。
3、输出:打印字符串的第一个字符,调用count方法统计字符出现的次数。
?代码详解
#枚举字符-单词分析s=list(input())ans=sorted(sorted(s),key=lambda x:s.count(x),reverse=True)[0]print(ans)print(s.count(ans))'''样例输入:lanqiao样例输出:a2样例详解:排序前:s=['l', 'a', 'n', 'q', 'i', 'a', 'o']排序后:s=['a', 'a', 'i', 'l', 'n', 'o', 'q']第一次sorted(s):按字典序从小到大升序排列↗(a->b->c)第二次sorted(key=lambda x:s.count(x)):按字母出现的频率升序排列↗reverse=True:表示从大到小降序排列↘(默认False升序排列)[0]:出现最多的字母索引为s[0]:'a''''
枚举字符-最大乘积⭐⭐
?传送锚点
984672 * 351 = 34561987298751 * 3462 = 3418759629 * 87146325 = 784316925...
符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?
注意,需要输出的是一个整数,表示那个最大的积,只输出乘积,不要输出整个算式。
?思路点拨
1、输入:创建列表a,存储符合条件的乘积。
2、枚举:先用全排列枚举1~9这9个数。
3、遍历:再套一层 j 循环给两个数分组。
4、判断:判断乘积是否符合题意?满足1~9这9个数,也就意味着没有0,没有重复。
5、输出:输出列表里符合条件的最大值。
?代码详解
#枚举字符串-最大乘积from itertools import permutations as pera=[]for i in per('123456789'): #i=('1', '2', '3', '4', '5', '6', '7', '8', '9') i=''.join(i) #i='123456789' for j in range(1,9): #1~8 b=str(int(i[:j])*int(i[j:])) #b=1*23456789 if len(set(b))==9 and '0' not in b: a.append(b) #123456789print(max(a)) #839542176'''函数详解:permutations:全排列函数''.join(i):格式转换(字符列表->字符串)len(set(b))==9:判断集合去重后是不是正好有9个数字'0' not in b:9个数字中不包含0为防止超时,提交时直接打印下面的代码print(839542176) '''
?第三幕 ·「日期型」
模拟日期-星期几⭐
?传送锚点
?思路点拨
先来一道经典的模板题~用五步搞定90%的日期题。
1、导包:看到日期题,第一步导包:from datetime import *
2、输入:输入起始日a和终止日b。
3、遍历:遍历日期,以1天为单位。timedelta(1)
4、判断:满足条件国庆节,计数器+1。
5、输出:最后打印计数器的值就OK了 \^o^/
?代码详解
#模拟日期-星期几from datetime import *a=date(1949,10,1)b=date(2012,10,1)cnt=0while a<=b: if a.weekday()==6 and a.month==10 and a.day==1: cnt+=1 a+=timedelta(1)print(cnt)'''函数详解:date(year,month,day):格式转换函数:数字格式→日期格式a.weekday():星期几函数,默认从星期一开始(下标为0)a.month: 日历月份a.day: 日历天数timedelta(1):1天(时间单位)print(9)'''
模拟日期-含2天数⭐
?传送锚点
?思路点拨
还是跟上面一样的套路,走个5步,题就解完了。
1、导包:看到日期题,第一步导包:from datetime import *
2、输入:输入起始日a和终止日b。
3、遍历:遍历日期,以1天为单位。timedelta(1)
4、判断:如果年月日中有2,计数器就+1
5、输出:最后打印计数器的值就O了q(≧▽≦q)
小细节(从a遍历到b前一个,因为日历函数规定,日期不超过9999年12月31日)
?代码详解
#模拟日期-含2天数from datetime import * #导入日期包a=date(1900,1,1) #开始日期b=date(9999,12,31) #结束日期cnt=0 #计数器while a<b: #遍历日期 if '2' in str(a): #天数含2 cnt+=1 #计数器+1 a+=timedelta(1) #下一天print(cnt+1) #print(1994240)
模拟日期-回文日期⭐⭐
?传送锚点
?思路点拨
第一种回文日期
1、输入:先将整数转换成日期格式 int -> date。
2、遍历:再遍历日期范围 a<=b 。
3、判断:日期格式转换为字符串,通过字符串逆序 [::-1] 操作,判断是否是回文数。
4、输出:输出第一种回文日期,打个标记 flag=1,下次不输出。
第二种回文日期
1、遍历:继续遍历,寻找第二种回文日期。
2、判断:用字符串切片 [] 操作,判断是否是满足条件的回文数。
3、输出:找到后输出第二种回文日期,break 结束循环。
?代码详解
#模拟日期-回文日期from datetime import * n=input() #"20200202"a=date(int(n[0:4]),int(n[4:6]),int(n[6:])) #2020-02-02 00:00:00b=date(9999,12,31) #9999-12-31 00:00:00flag=0 #标记是否输出了一次回文数while a<=b: #遍历日期范围 a+=timedelta(1) #从当前数+1开始遍历 date=str(a).replace("-","")[:8] #日期格式->为字符串"20200202" if date==date[::-1]: #[::-1]:字符串逆序 if flag==0: #没输出过回文数 print(date) #输出第一种回文日期:20211202 flag=1 #做标记下次遇到回文数不打印 if date[0]==date[-1]==date[2]==date[-3] and date[1]==date[-2]==date[3]==date[-4]: print(date) #输出第二种回文日期:21211212 break #跳出循环
?第四幕 ·「地图型」
模拟地图-灌溉⭐
?传送锚点
?思路点拨
小蓝总结了一下,地图题主要就是3步走?:输入→遍历→输出
1、输入:先输入题目里的一堆参数,用二维列表a模拟方格地图,初始化灌溉好的方格。
2、遍历:遍历每一个方格,如何判断方格的上下左右位置合法,进行灌溉(0赋值为1)
3、输出:统计地图里灌溉好的方格数(1的数量)。
?代码详解
#模拟地图-灌溉#输入n,m=map(int,input().split()) #3行6列t=int(input()) #2个出水口a=[[0]*(m) for _ in range(n)] #初始的方格b=[[0]*(m) for _ in range(n)] #灌溉后的方格for i in range(t): r,c=map(int,input().split()) a[r-1][c-1]=1 #初始化出水口k=int(input())#遍历for _ in range(k,0,-1): #一分钟灌溉一次 for i in range(n): for j in range(m): if a[i][j]==1: b[i][j]=1 #中心值标记 if i-1>=0: #合格范围标记四个方向的水管 b[i-1][j]=1 if i+1<n: b[i+1][j]=1 if j-1>=0: b[i][j-1]=1 if j+1<m: b[i][j+1]=1 a=b #灌溉完毕递归下一次#输出cnt=0for i in b: for j in i: cnt+=jprint(cnt) #9个方格被灌溉'''样例输入:3 622 23 41样例输入:9样例详解:0代表没灌溉,1代表已灌溉a=[[0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0]] b=[[0, 1, 0, 0, 0, 0], [1, 1, 1, 1, 0, 0], [0, 1, 1, 1, 1, 0]]'''
模拟地图-扫雷⭐
?传送锚点
?思路点拨
1、输入:老规矩,输入题目的一堆参数,创建两个地图(二维列表)代表扫雷前和扫雷后。
2、遍历:遍历每个坐标,有地雷标记为9,没地雷遍历八宫格范围内是否有地雷。
3、输出:把扫雷后的新地图,格式化打表一遍。
?代码详解
#模拟地图-扫雷#输入n,m=map(int,input().split()) #3行4列a=[list(map(int,input().split())) for _ in range(n)]b=[[0]*m for _ in range(n)] #新地图 #遍历for i in range(n): for j in range(m): if a[i][j]==1: #存在地雷 b[i][j]=9 #标记地雷 else: #遍历八宫格 for k in range(i-1,i+2): #i-1~i+1 for h in range(j-1,j+2): #j-1~j+1 if 0<=k<n and 0<=h<m: #在合法范围内 if a[k][h]==1: #有地雷的话 b[i][j]+=1 #地雷数量+1 #输出for i in range(n): for j in range(m): print(b[i][j],end=" ") print()'''样例输入:3 40 1 0 01 0 1 00 0 1 0样例输出:2 9 2 19 4 9 21 3 9 2'''
模拟地图-图像模糊⭐
?传送锚点
?思路点拨
上一道题的进阶版,换汤不换药~套地图模板就行~
1、输入:先输入题目的一堆参数,再创建两张图片(二维列表)代表图像处理前后。
2、遍历:遍历每个坐标,正常范围内是九宫格数字求和除以个数。
3、输出:把图像处理后的新图片(二维列表),格式化打表一遍。
?代码详解
#模拟地图-图像模糊#输入n,m=map(int,input().split()) # 3 4a=[list(map(int,input().split())) for _ in range(n)]b=[[0]*m for i in range(n)] #新地图#遍历for i in range(n): #0 1 2 for j in range(m): # 0 1 2 3 num,cnt=0,0 #求和值和计数器 for k in range(i-1,i+2): #i-1~i+1 左右3个数字 for h in range(j-1,j+2): #j-1~j+1 上下3个数字 if 0<=k<n and 0<=h<m: #如果在正常索引范围内 num+=a[k][h] #求和值累加 cnt+=1 #计数器+1 b[i][j]=num//cnt #灰度值赋值#输出 for i in range(n): for j in range(m): print(b[i][j],end=' ') print()'''样例输入:3 40 0 0 2550 0 255 00 30 255 255样例输出:0 42 85 127 5 60 116 170 7 90 132 191 '''