image

编辑人: 长安花落尽

calendar2025-06-15

message6

visits622

第15届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2023年12月17日真题答案及解析

一、单选题

1、以下哪项是取余运算符?(   )

A *

B //

C %

D +

解析:【喵呜刷题小喵解析】:在编程中,取余运算符通常表示为“%”。这个运算符用于计算两个数相除后的余数。因此,选项C“%”是取余运算符。其他选项A、B和D都不是取余运算符。A选项“*”是乘法运算符,B选项“//”是整数除法运算符,D选项“+”是加法运算符。

2、已知:s = "python",执行 print(s[::2])语句后,输出的结果是(   )。

A python

B pto

C nohtyp

D yhn

解析:【喵呜刷题小喵解析】本题考察的是字符串的切片操作。
在Python中,`s[::2]`表示对字符串`s`进行切片,每隔一个字符取一个。具体来说,它从字符串的开头到结尾,每隔一个字符取一个,形成新的字符串。
对于字符串`s = "python"`,它的字符是`p`,`y`,`t`,`h`,`o`,`n`。按照每隔一个字符取一个的规则,取出的字符是`p`,`y`,`h`,`n`,因此,执行`print(s[::2])`语句后,输出的结果是`pto`。
所以,正确答案是B选项。

3、在 Python 中,下面哪个选项可以获取字符串中某字符出现的次数?(   )

A length()

B count()

C size()

D len()

解析:【喵呜刷题小喵解析】:在Python中,`count()`函数用于获取字符串中某字符出现的次数。`length()`、`size()`和`len()`都不是Python中用于获取字符串长度的标准方法,其中`len()`函数返回的是字符串的长度,而不是特定字符出现的次数。因此,正确答案是B选项。

4、Python 中的列表和元组的主要区别是(   )。

A、

列表中元素的值可修改,元组中元素的值不可修改

B、

列表是有序的,元组是无序的

C、

列表是一维的,元组可以是多维的

D、

列表可以包含不同类型的元素,元组只能包含相同类型的元素

解析:【喵呜刷题小喵解析】:在Python中,列表和元组都是有序的可变序列类型,它们都可以包含多个元素,但主要的区别在于它们的元素是否可变。列表中的元素值是可以修改的,而元组中的元素值是不可修改的。因此,选项A“列表中元素的值可修改,元组中元素的值不可修改”是正确的。选项B“列表是有序的,元组是无序的”是不正确的,因为列表和元组都是有序的。选项C“列表是一维的,元组可以是多维的”也是不正确的,列表和元组都可以是一维或多维的。选项D“列表可以包含不同类型的元素,元组只能包含相同类型的元素”也是不正确的,列表和元组都可以包含不同类型的元素。

5、关于 Python 语言的浮点数类型,以下选项中描述错误的是(   )。

A 小数部分不可以为 0

B 带有小数的类型通常用浮点数类型表示

C float(x) 中 x 可以是十进制实数形式的字符串

D 整数写成指数形式是浮点数类型

解析:【喵呜刷题小喵解析】:在Python语言中,浮点数类型用于表示带有小数点的数。小数部分可以为0,如0.0或0.5,因此选项A的描述是错误的。带有小数的类型通常用浮点数类型表示,所以选项B描述是正确的。在Python中,可以使用float(x)将字符串x转换为浮点数,其中x可以是十进制实数形式的字符串,所以选项C描述也是正确的。然而,选项D的描述是错误的,因为在Python中,整数写成指数形式仍然是整数类型,而不是浮点数类型。例如,10**3表示1000,仍然是整数,而不是浮点数。因此,选项D描述错误。

二、实操题

6、小青有 N 个小球,小蓝有 M 个小球,请计算他们一共有多少个小球。

例如:N = 2,M = 3,表示小青有 2 个小球,小蓝有 3 个小球,一共有 5 个小球(5 = 2 + 3)。

输入描述:

第一行输入一个整数 N(1≤N≤1000),表示小青的小球数量第二行输入一个整数 M(1≤M≤1000),表示小蓝的小球数量

输出描述:

输出一个整数,表示一共有多少个小球


样例输入:

2
3

样例输出:

5

参考答案:对于这个问题,我们需要计算小青和小蓝的小球总数。输入给出小青有N个小球,小蓝有M个小球。所以,他们一共有N+M个小球。

解析:【喵呜刷题小喵解析】:
首先,这个问题是一个简单的加法问题,需要我们将小青和小蓝的小球数量相加。根据题目描述,输入给出了小青的小球数量N和小蓝的小球数量M,所以我们可以直接计算N+M得到他们一共有多少个小球。

在这个问题中,我们不需要复杂的算法或数据结构,只需要进行简单的加法运算即可。因此,我们可以直接写出代码来解决这个问题。在代码中,我们可以定义两个变量N和M来分别存储小青和小蓝的小球数量,然后计算N+M得到他们一共有多少个小球,并将结果输出。

具体的代码实现可以如下:


```python
N = int(input())
M = int(input())
print(N + M)
```
在代码中,`input()`函数用于读取用户输入,`int()`函数用于将输入的字符串转换为整数类型,`print()`函数用于输出结果。程序首先读取用户输入的N和M,然后计算N+M得到他们一共有多少个小球,并将结果输出。

7、给定一个长度为 11 的字符串 S,表示电话号码,然后将电话号码中第三位数字后的连续四位数字用“*”替换,并输出替换后的字符串。

例如:S = "13900001234",用“*”替换第三位数字后的连续四位数字为“139****1234”。

输入描述:

输入一个长度为 11 的字符串 S(字符串仅包含 0~9 之间的数字且首个字符只能为 1),表示电话号码

输出描述:

输出一个字符串,表示替换后的字符串


样例输入:

13900001234

样例输出:

139****1234

参考答案:根据题目要求,我们需要将电话号码中第三位数字后的连续四位数字用“*”替换。首先,我们需要找到第三位数字的位置,然后将该位置后的四个字符替换为四个“*”。假设电话号码为 S,长度为 11。我们可以用以下步骤实现:1. 找到第三位数字的位置,记为 index。由于字符串下标从 0 开始,因此 index = 2。2. 构造一个字符串 result,将电话号码 S 的前两位数字添加到 result 中。3. 将四个“*”添加到 result 中,对应的位置是 S 的第三、第四、第五和第六位数字。4. 将电话号码 S 的最后五位数字添加到 result 中。5. 返回 result。用 Python 代码实现如下:```pythondef replace_phone_number(S):index = 2result = S[:index] + '*' * 4 + S[index + 4:]return result```

解析:【喵呜刷题小喵解析】:
本题是一个字符串处理问题,需要将电话号码中第三位数字后的连续四位数字用“*”替换。在编程中,可以通过字符串切片和拼接的方式实现。具体实现步骤可以参考喵呜AI答案中的代码。

首先,我们找到第三位数字的位置,记为 index。由于电话号码长度为 11,因此 index = 2。然后,我们构造一个字符串 result,将电话号码 S 的前两位数字添加到 result 中。接着,我们将四个“*”添加到 result 中,对应的位置是 S 的第三、第四、第五和第六位数字。最后,我们将电话号码 S 的最后五位数字添加到 result 中,并返回 result。

在实际应用中,可以使用类似的代码实现电话号码的格式化处理,以满足不同的需求。

8、给定 N 个长度不同的字符串,请将每个字符串的最后一个字符删除,并按长度从短到长的顺序换行输出。

例如:N = 3,3 个字符串分别为 dfgas、abc、cbdf,删除最后一个字符后为 dfga、ab、cbd;

按长度从短到长的顺序换行输出为:

ab cbd dfga

输入描述:

第一行输入一个整数 N(2≤N≤10),表示字符串的个数

第二行输入 N 个长度不同的字符串(2≤字符串长度≤20),字符串之间以一个空格隔开

输出描述:

输出 N 行字符串,表示所有字符串删除最后一个字符后,按长度从短到长的顺序换行输出的结果


样例输入:

3
dfgas abc cbdf

样例输出:

ab cbd dfga

参考答案:br />```pythonN = int(input())strings = input().split()for i in range(N):strings[i] = strings[i][:-1]strings.sort(key=len)for s in strings:print(s)```

解析:【喵呜刷题小喵解析】

首先,我们需要读取输入。输入的第一行是一个整数N,表示有N个字符串需要处理。第二行是N个字符串,以空格分隔。

接着,我们需要删除每个字符串的最后一个字符。这可以通过字符串切片操作实现,即`strings[i] = strings[i][:-1]`。

然后,我们需要按照字符串的长度进行排序。Python的内置函数`sort()`可以完成这个任务,但需要提供一个排序的key。在这里,我们使用`len()`函数作为key,即`strings.sort(key=len)`。

最后,我们按照排序后的顺序输出每个字符串。这可以通过一个简单的循环实现,即`for s in strings: print(s)`。

需要注意的是,由于题目要求换行输出,因此在输出每个字符串时,需要使用`print()`函数,而不是直接输出到一行。

9、有 N 张扑克牌叠放在桌上,A 和 B 两人轮流抽牌,每次只能从最上面或最下面抽一张牌,当最后一张牌被抽完时,比较 A 和 B 两人扑克牌的点数总和,点数总和大的一方胜利,点数相同时双方均不算胜利。A 先抽牌,请统计一共有多少种不同的抽牌情况,A 有多少种不同的获胜情况。

例如:N = 3,有 3 张扑克牌,从上往下的点数依次为 3、2、1。A 先抽牌,所有不同的抽取情况有:

第一种:A 抽 3,B 抽 1,A 再抽 2,A 的点数总和为 5,B 的点数总和为 1;第二种:A 抽 3,B 抽 2,A 再抽 1,A 的点数总和为 4,B 的点数总和为 2;第三种:A 抽 1,B 抽 3,A 再抽 2,A 的点数总和为 3,B 的点数总和为 3;第四种:A 抽 1,B 抽 2,A 再抽 3,A 的点数总和为 4,B 的点数总和为 2;一共有 4 种不同的抽牌情况,A 有 3 种不同的获胜情况。

输入描述:

第一行输入一个整数 N(2≤N≤20),表示扑克牌的张数

第二行输入 N 个整数(1≤整数≤13),同一个整数不能出现超过 4 次,表示从上往下每张扑克牌的点数, 整数之间以一个空格隔开

输出描述:

第一行输出一个整数,表示一共有多少种不同的抽牌情况第二行输出一个整数,表示 A 有多少种不同的获胜情况


样例输入:

3
3 2 1

样例输出:

4
3

参考答案:br />```123```

解析:【喵呜刷题小喵解析】
对于这个问题,我们可以使用动态规划来解决。

首先,我们定义一个二维数组dp[i][j],其中i表示当前剩余的牌数,j表示当前A的点数总和。dp[i][j]表示在剩余的i张牌中,A的点数总和为j的方案数。

对于状态转移,我们可以考虑A抽最上面一张牌和抽最下面一张牌两种情况。

1. 如果A抽最上面一张牌,那么B只能抽最下面一张牌,此时A的点数总和变为j+top,B的点数总和变为j+bottom,状态转移方程为dp[i-2][j+top+bottom] += dp[i][j]。

2. 如果A抽最下面一张牌,那么B只能抽最上面一张牌,此时A的点数总和变为j+bottom,B的点数总和变为j+top,状态转移方程为dp[i-2][j+top+bottom] += dp[i][j]。

最终,dp[1][j]表示A抽完牌后,A的点数总和为j的方案数,我们需要遍历所有的j,并统计dp[1][j]的和,即为总的抽牌情况数。

对于A的获胜情况,我们需要遍历所有的j,如果dp[1][j] > 0,说明存在一种方案使得A抽完牌后,A的点数总和为j,此时我们需要判断j是否大于B的点数总和,如果大于,则说明A获胜,将dp[1][j]累加到获胜情况数中。

对于样例输入3 3 2 1,我们可以按照上述方法计算总的抽牌情况数和A的获胜情况数,分别为12和3。

10、有一张 N 行 N 列的网格纸,网格中每个小格子都是 1×1 的正方形,有些格子被填充成橙色。请数一数橙色区域一共有多少个矩形。

例如:N = 4,4 行 4 列的网格纸如下图:

图中网格纸的橙色区域一共有 7 个矩形。

输入描述:

第一行输入一个正整数 N(2≤N≤50)

接下来输入 N 行,每行 N 个整数(整数只能为 1 或 0 ),其中 1 表示填充成橙色,0 表示没有填充成橙色,整数之间以一个空格隔开

输出描述:

输出一个整数,表示橙色区域的矩形数量


样例输入:

4
1001
0000
1001
0110

样例输出:

7

参考答案:```def countRectangles(N, grid):count = 0for i in range(N):for j in range(N):if grid[i][j] == 1:row_start = icol_start = jwhile row_start < N and grid[row_start][col_start] == 1:row_start += 1while col_start < N and grid[i][col_start] == 1:col_start += 1rect_width = row_start - irect_height = col_start - jcount += rect_width * rect_heightreturn countN = int(input().strip())grid = []for _ in range(N):grid.append(list(map(int, input().strip().split())))print(countRectangles(N, grid))```

解析:【喵呜刷题小喵解析】:

这道题是一道计数题,我们需要计算给定网格中橙色区域的矩形数量。

首先,我们可以遍历整个网格,对于每个橙色格子,我们尝试找到其所在矩形的宽度和高度。

具体地,我们可以从当前格子开始,向上和向右扩展,直到遇到非橙色格子为止。这样,我们就可以得到当前格子所在矩形的宽度和高度。

然后,我们将这个矩形的宽度和高度相乘,就得到了这个矩形的面积。

最后,我们将所有矩形的面积加起来,就得到了橙色区域的矩形数量。

具体实现时,我们可以使用两个嵌套的循环来遍历整个网格。对于每个橙色格子,我们分别向上和向右扩展,直到遇到非橙色格子为止。然后,我们计算矩形的宽度和高度,并将矩形的面积加到计数器中。

最后,我们返回计数器的值作为结果。

注意,在输入时,我们需要将输入的字符串转换成整数列表,以便进行后续的计算。

在输出时,我们只需要输出计数器的值即可。

11、老师在黑板上写了一个不超过 500 位的整数 n(1≤n<10500),要求同学们擦掉其中任意 k 个数字,剩余数字的顺序不变,希望得到的数最大。

例如:n = 69134,k = 2,从 69134 中擦掉 2 个数字;从左往右,将第一个位置的 6 和第三个位置的1 擦掉,变成的新数 934 是最大的。

输入描述:

输入两个整数 n 和 k(1≤n<10500,0≤k<n 的位数),整数之间以一个空格隔开

输出描述:

输出一个整数,表示擦掉 k 个数字后,得到的最大数


样例输入:

69134 2

样例输出:

934

参考答案:对于这个问题,我们可以按照以下步骤来求解:1. 首先,将输入的整数n转换为字符串形式,方便后续处理。2. 从左到右遍历这个字符串,找到第一个出现k+1次的数字,记为x。3. 将x及其右侧的所有数字都删除,得到一个新的字符串。4. 将剩下的数字按照从大到小的顺序重新排列,得到最终的字符串。5. 将最终的字符串转换回整数形式,并输出。

解析:【喵呜刷题小喵解析】:

这个问题的关键在于如何确定擦除哪些数字。一种直观的方法是,从左到右遍历字符串,每次遇到相同的数字就擦除,直到擦除k个数字。但是这种方法并不能保证得到的结果是最大的。

一个更好的方法是,从左到右遍历字符串,找到第一个出现k+1次的数字,记为x。然后将x及其右侧的所有数字都删除,得到一个新的字符串。这是因为,如果x不是第一个出现k+1次的数字,那么它右边的数字一定也是x,这意味着这些数字可以被擦除而不会影响结果。因此,将x及其右侧的所有数字都删除,然后将剩下的数字按照从大到小的顺序重新排列,就可以得到最大的结果。

这个算法的时间复杂度是O(n),其中n是字符串的长度。这是因为我们需要遍历一次字符串,并且每次操作都是常数时间。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:第15届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2023年12月17日真题答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share