蓝桥杯Python组刷题记录

您所在的位置:网站首页 python获得当前年份 蓝桥杯Python组刷题记录

蓝桥杯Python组刷题记录

2023-04-07 07:07| 来源: 网络整理| 查看: 265

3天冲刺蓝桥杯。

4月4日

本文中答案参考了大佬的解法,解析参考了ChatGPT。

2022真题

1.

直接print结果

2.

找规律,规律是二维码数加3,直接输出结果

3.

先求整周天数,再求余下的一周天数,相加得到总共需要的天数

知识点复习:

map()函数

map() 函数是 Python 内置函数之一,用于对可迭代对象中的每个元素应用同一个函数,生成一个新的可迭代对象,返回一个 map 对象。map() 函数的基本语法如下:

scssCopy code map(function, iterable, ...)

其中,function 是一个函数,用于处理 iterable 中的每个元素;iterable 是一个可迭代对象,如列表、元组、集合等;可以传入多个可迭代对象,如果传入多个,function 必须接收相应数量的参数。

map() 函数的使用方法很简单,只需将要应用的函数和可迭代对象传递给 map() 函数即可。例如,将一个列表中的所有元素都加 1:

pythonCopy code >>> numbers = [1, 2, 3, 4, 5] >>> def add_one(x): ... return x + 1 ... >>> result = map(add_one, numbers) >>> list(result) [2, 3, 4, 5, 6]

这里,我们定义了一个 add_one 函数,用于将参数加 1,然后将该函数和 numbers 列表传递给 map() 函数,得到一个 map 对象,最后通过 list() 函数将其转换为列表。

除了使用自定义函数之外,还可以使用 lambda 函数。例如,将一个列表中的所有元素都平方:

pythonCopy code >>> numbers = [1, 2, 3, 4, 5] >>> result = map(lambda x: x ** 2, numbers) >>> list(result) [1, 4, 9, 16, 25]

在这个例子中,我们使用了 lambda 函数,用于计算平方,然后将该函数和 numbers 列表传递给 map() 函数,得到一个 map 对象,最后通过 list() 函数将其转换为列表。

split()方法

split() 方法用于将这行字符串按空格分割成若干个子字符串,并返回一个包含这些子字符串的列表。

整除运算符 //

// 是 Python 中的整除运算符,用于将除法的结果向下取整为整数

取模运算符%

% 是 Python 中的取模运算符,用于求一个数除以另一个数的余数。

编译错误避免:

n % = week

这行代码是有语法错误的,它应该是 n %= week,而不是 n % = week。

%= 是 Python 中的“就地取模运算符”,它等价于 n = n % week,即计算 n 除以 week 的余数,并将结果赋值给 n。这个操作可以理解为将 n 对 week 取模后,将余数赋值给 n,这样变量 n 就表示剩余的题数了。

4.

填空题,说得都有道理,直接输出ABC

5.

直接遍历每对数组会超时,只能求解30%的用例,把n个整数相加,然后减去某个整数,再乘以相加得到的和能节约时间

超时写法(不可取):

6.

本题可暴力求解,手动排好序输出,也可使用把字符串存到列表里,使用sort()函数排序后,再输出列表

知识点复习:

sort()

sort() 是 Python 中内置的列表方法,用于对列表进行排序。该方法可以接收两个可选参数 key 和 reverse。

key 参数用于指定排序的关键字,即按照哪个属性进行排序。默认情况下,sort() 方法按照列表中元素的大小关系进行排序。如果需要按照其他属性进行排序,则可以使用 key 参数来指定。reverse 参数用于指定排序的顺序,即升序还是降序。如果设置为 True,则表示降序排列;否则,默认为升序排列。

sort() 方法会对原列表进行修改,因此如果需要保留原始列表,建议先将其复制一份再进行排序。

print中的end=""

这行代码的作用是在 Python 中输出变量 i 的值,并且不在输出结尾添加换行符,而是添加一个空字符串作为结尾。

具体来说,print() 函数的 end 参数用于指定在输出结尾添加的字符串,默认情况下为换行符 \n。将 end 参数设置为空字符串,可以让输出结果不添加换行符,而是直接将后续的输出内容添加在同一行。

7.

找规律,灌木最多生长到与端点距离的二倍,遍历全部灌木,取与左右端点距离最大的那个

8.

解法一

要想正确表示2022年的每一天,得引入时间库datetime,不到10的月份或者天前面加个0,使用while循环遍历,break在满足条件时跳出循环,避免一个数被计算成多个顺子数,例如20220123有012和123两个顺子,如果不跳出循环,这个数就被算两次了

知识点复习:

datetime库

datetime 是 Python 标准库中的一个模块,提供了处理日期和时间的类和函数。通过 datetime 模块,可以方便地处理时间相关的操作,例如获取当前时间、日期格式化、日期比较、时间加减等等。

datetime.date:表示一个日期对象,包含年、月、日等信息。可以使用 datetime.date(year, month, day) 创建一个日期对象。

datetime.timedelta:表示一个时间差(或时间间隔)对象,可以用来进行时间计算。例如,两个日期之间的时间差、将一个时间向前或向后推移一段时间等。可以使用 datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) 创建一个时间差对象。

datetime.year 获取年份

datetime.month 获取月份

datetime.day 获取天

解法二

不用日期库datetime也可求解,因为每月不同的就29、30、31这三天,对于2月来说,增加这3天不会增加顺子,对于其他月来说,增加31也不会加顺子,只有1231里才有一个123顺子,所以可以把全部月份都按31天算。

解法三

更暴力的解法,发现只可能存在顺子012或123,只需检查这两个顺子数即可。

9.

解法一

这题还是找规律,对折后长是原来的宽,宽是长的一半,关键是同时赋值l,w=w,l//2,

不可像以上用两个式子代替,这样赋值有先后,解出来的结果就错了(错误示范)

解法二

考场没想出来,分总不能不要吧,解法二,暴力解法,直接输出每种纸张对应的长宽。

10.

解法一

这道题目是中等题,有一些难度。总体思路是先判断整个数的每个数字和整个数字,再判断子串,最后遍历寻找。

有两个细节需注意,一是n**0.5,判断整个数字的因数时,判断到它的开方就够了,二是num[i:j+1],由于python索引右边一个数取不到,所以加个1。

解法二

解法二就是自己推出答案,然后填上去。引用下大佬的话,这题其实是质数排列组合问题,由一位数扩展到更多位 一位数是质数的:2,3,5,7 扩展到两位数,两两组合剩下23,37,53,73 然后再扩展到三位数,就已经得出结论了,373。

其实解法二比解法一更不容易想到。

今天就刷到这吧,明天继续。

4月5日

11.

蓝桥杯的填空题,有点像数学的找规律题,编程可编可不编,反正最后输出结果就行

这道题,没什么编程成分,找到规律稍微输出结果就行,得按数字顺序找,避免找漏

12.

这道题,用内置的sort函数排序即可

知识点复习:

正则表达式lambda

Lambda表达式是Python中的一种匿名函数,它可以用于简单的函数定义而不需要使用def语句定义函数。Lambda函数通常是在需要一个函数,但是不希望在程序中定义一个正式的函数的时候使用。Lambda函数用于在一行中表示简单函数,常常用于排序、过滤和映射等操作。

Lambda函数的语法格式如下:

lambda arguments: expression

其中,arguments是Lambda函数的参数,expression是Lambda函数的返回值。

例如,下面的Lambda函数返回两个数的和:

sum = lambda x, y: x + y print(sum(2, 3)) # 输出5

13.

解法一

这题正解用博弈论,太复杂了我只有三天时间不搞这个,穷举,得出答案

14.

解法一

这题还是找规律,k种卡牌最多能发给k*(k+1)/2个人,推导如下:

2种卡牌有 11 12 22 三个组合 1+2=3 3种卡牌有 11 22 33 12 13 23 6种组合 1+2+3=6

4种卡牌有 11 22 33 44 12 13 14 23 24 34 10种组合 1+2+3+4=10

构造个累和函数会超时,用数列求和公式(首项+尾项)项数/2,得到k种卡牌有k*(k+1)/2种组合

以上是错误写法,只能跑出70%的用例,剩下的超时解不出。

解法二

另一种思路,是用组合数来解,k张卡牌有Ck2+Ck1种组合。

15.

解法一

这道题就是切分字符串,转整数存到列表中用sort()方法排序输出,有个易错点就是员工编号列表要避免重复,因为员工可能不止打一次卡。

解法二

另一个巧妙的做法就是先允许重复,再把编号列表转换成集合类型,集合里不能重复自动去除重复元素了,再把编号集合转换为列表类型。

16.

这道题反着解,构造一个三角回文数,然后判断它是不是大于20220514,一大于就终止。

如果像上面这样正着解,从大于20220514中的数中,一个个判断它是不是三角回文数,那就超时解不出来了。

知识点复习:

str(number):将整数 number 转换成字符串。

[::1]:切片操作,相当于复制整个字符串,因为步长为正,所以按照原来的顺序。

字符串翻转

[::-1]:切片操作,相当于将整个字符串倒序排列,因为步长为负,所以逆序排列。

str(number)[::1]==str(number)[::-1]:比较整数 number 的正序字符串和倒序字符串是否相等,如果相等,则 number 是回文数,返回 True,否则返回 False。

17.

经典找规律,这个题目里是周期规律,我们知道过一整周星期不变,那过20天相当于-1天,-1的22次方等于1,6+1=7

-1有时候突然想不到,毕竟是负数天数。不过还好,用6代替也能在规定时间内解出答案。

18.

正解,使用动态规划做,运行得快,递归慢,不行。

这里要注意的是k是剩余酒量,所以if条件语句对应的是k//2而不是k*2,即当前酒量加倍得到剩余酒量,剩余酒量减半就是当前酒量了。

代码if条件语句部分详细解释:

if j == m and i != n: continue if not k & 1 and i > 0: # 酒店 dp[i][j][k] += dp[i - 1][j][k // 2] if k != m and j > 0: dp[i][j][k] += dp[i][j - 1][k + 1]

如果当前状态已经遇到了 m 个花,但还没有遇到 n 个酒店,则跳过当前状态的转移,因为遇到花是最后一个事件,此时再遇到酒店就无法继续喝酒了。

如果当前状态中还剩余偶数斗酒,且已经遇到了 i 个酒店,则可以从 dp[i-1][j][k//2] 转移过来,其中 //2 表示除以 2 取整,这是因为每遇到一个酒店,李白就会将剩余的酒量翻倍,也就是乘以 2。

因为翻倍后得到的酒的数量必为偶数,所以限制偶数条件。

如果当前状态中剩余的酒量不为 m,且已经遇到了 j 个花,则可以从 dp[i][j-1][k+1] 转移过来,因为每遇到一朵花,李白就会喝掉一斗酒。

知识点复习:

定义三维数组

三维数组 a * b * c

方法一:列表表达式

dp = [[[0 for k in range(c)] for j in range(b)] for i in range(a)]

方法二:嵌套循环

三维数组 n* m * k

n = 3 m = 4 k = 5 dp = [] for i in range(n+1): tmp1 = [] for j in range(m+1): tmp2 = [] for l in range(k+1): tmp2.append(0) tmp1.append(tmp2) dp.append(tmp1)

&

&是位运算符,表示对两个二进制数进行逐位的与运算。if not k & 1 用来判断k是不是偶数,是偶数就返回True。

动态规划

重叠子问题指的是在解决一个问题时,会重复计算一些子问题的解,这些子问题具有相同的计算过程和结果。在动态规划中,通过将已经计算过的子问题的解存储起来,在需要时直接使用已经计算的结果,避免了重复计算,从而提高了算法的效率。

最优子结构性质指的是一个问题的最优解可以通过子问题的最优解来计算得出。换句话说,就是一个问题可以被分解成相似的子问题,而每个子问题的最优解都能够组合成原问题的最优解。这个性质是动态规划算法的一个重要性质,因为它使得我们可以将一个大问题分解成多个小问题,并且可以通过计算子问题的最优解来推导出原问题的最优解。

动态规划(Dynamic Programming,简称 DP)是一种常见的算法思想,适用于优化一类具有重叠子问题和最优子结构性质的问题,可以显著减小时间复杂度。

动态规划通常使用一个数组来存储中间结果,称之为“状态”,并根据“状态转移方程”推导出最终的答案。在状态转移方程中,当前状态是由前面的若干状态推导而来,因此也需要考虑状态的初始值和边界条件。

Python 中可以使用列表字典来存储状态,也可以使用 NumPy 等库提供的数组类型来加速运算。动态规划可以分为自顶向下(即记忆化搜索)和自底向上(即迭代法)两种实现方式,其中自底向上的方式通常更高效。

动态规划的应用非常广泛,比如经典的背包问题、最长公共子序列问题、最短编辑距离问题等,还可以用于计算概率、求解博弈、模拟物理过程等领域。

continue

在Python中,continue是一个控制流语句,用于在循环中跳过当前迭代并进入下一次迭代。当程序执行到continue语句时,它会立即跳到循环的下一个迭代。

以上是用递归写的,很清晰但超时,只能跑出40%的用例,所以不能这么写,python慢,得时刻考虑代码运行时间。

已经在怀疑为什么要参加圈钱杯了,有点晚了明天再刷

4月6日

又是新的一天,开启今天的刷题之旅

19.

解法一

这个解法比较巧妙,构建字典,取出现次数最多的排序后输出,代码很精简。

不过这段代码在超时的边缘了,测试一会全通过一会有几个用例不通过。

知识点复习:

.setdefault(a,b)

用于添加键值对

该方法接受两个参数:键和默认值。如果字典中不存在给定的键,则将其添加到字典中,并将值设置为默认值;如果字典中已经存在该键,则不执行任何操作。然后,该方法返回该键的值。

.count(i)

统计字符出现次数

.join()

将列表中的字符连接成一个字符串输出

sorted()

sorted() 是 Python 的一个内置函数,用于对可迭代对象(比如列表、元组)进行排序,返回一个新的排好序的列表。

例如,对于一个包含多个整数的列表,可以使用 sorted() 对其进行排序:

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] sorted_numbers = sorted(numbers) print(sorted_numbers) # 输出 [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] 解法二

这个解法也很精简,并且不会超时

知识点复习:

ord()函数

将字符转换为ASCII码值

chr()

chr(i)是Python内置函数,用于将Unicode编码转换为对应的字符。在这段代码中,chr(i)用于将计算出的ASCII码转换为对应的字符,以便于输出。

20.

还是要用到一些算法思想,二分法加一。

难点: ① N!末尾有K个0是,每个0都是一个2×5,而在N!的因子中2要多于5,所以有多少个0取决于N!中有多少个因子5,有一个5就有一个0。 ②代码中的N是指N的阶乘(N!)

代码里有个细节需留意,即区间的开闭,本解答是左闭右闭区间,依据是if count1(N) >=k: r=N,当n取中点可能有解时,取的是左半区间。

关于为什么用 count += num // 5 而不是 count += 1:

统计阶乘中因子5的个数用 count += num // 5 而不是 count += 1,是因为一个数可以同时贡献多个因子 5。比如 25 的阶乘中,有 5 个数贡献了因子 5,分别是 5、10、15、20、25,因此应该累加 5 个因子 5。而如果用 count += 1 的方式,就只能计算出 1 个因子 5。这也是为什么统计因子5的个数需要不断除以 5 直到结果小于 5,因为一个数可以贡献多个因子 5,需要统计所有的因子 5 才能得到正确的答案。

知识点复习:

while

while 是 Python 中的一个循环结构,用于在满足条件的情况下重复执行一段代码。

while 循环的基本语法为:

arduinoCopy code while condition: # code block

其中 condition 为循环条件,如果满足该条件则执行 code block 中的代码。当代码块执行完毕后,再次检查循环条件,如果仍然满足,则再次执行代码块,如此重复,直到循环条件不满足为止。

num//5可以作为循环条件是因为在 Python 中,任何数值类型都可以被当作 Boolean 类型使用,而当数值为 0 时被视为 False,非 0 时视为 True。因此,当 num // 5 的值为 0 时,循环条件为 False,结束循环;当 num // 5 的值大于 0 时,循环条件为 True,继续循环。

Boolean(布尔)类型是计算机编程中的一种基本数据类型,它只有两个值,分别是True和False。通常用于判断和逻辑运算,例如判断一个条件是否成立,或者组合多个条件进行逻辑运算等。在Python中,True和False都是内置的布尔型常量,可以直接使用。

在代码中, while(num//5) 的含义是在 num 除以 5 的结果不为 0 时,持续执行循环中的代码块。

二分法

二分法(Binary Search)是一种用于在有序数组中快速查找目标值的算法。其思想是不断将待查找区间对半划分,缩小搜索范围,直到找到目标值或者确定其不存在。

以查找有序数组中的目标值为例,具体实现如下:

def binary_search(nums, target): # 确定左右边界 left, right = 0, len(nums) - 1 # 当左边界小于等于右边界时循环查找 while left target: right = mid - 1 # 如果中间位置的元素小于目标值,则在右半边继续查找 else: left = mid + 1 # 如果查找失败,返回 -1 return -1

正所谓你编程的样子很华丽,你超时的样子很狼狈,以上没有用到算法思想的暴力解法不可取。

吃个饭回来再刷。

21.

大佬咋不把注释写全?ChatGPT解释这个把我绕晕了,痛苦面具...这题跳过

22.

23.

解法一解法二

还是比较喜欢这种题

24.

这雷我是扫不动了,只能过40%的用例

话说某扫雷题之后,题解都变少了......

24.

还是这种题好,简单易懂,不过都是这种题的话,我也不好混...

有点晚了,明天最后一天再继续吧......



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3