image

编辑人: 未来可期

calendar2025-06-01

message8

visits850

第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2022年8月21日真题答案及解析

一、实操题

1、编程实现:

给定一个正整数,输出正整数个位上的数字。

输入描述:

输入一个正整数

输出描述:

输出正整数个位上的数字


样例输入:

123

样例输出:

3

参考答案:br />对于这个问题,我们可以使用取模运算符(%)来获取正整数的个位数字。具体实现如下:```pythondef get_last_digit(n):return n % 10# 测试n = 123print(get_last_digit(n)) # 输出:3```

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

这个问题要求我们输出给定正整数的个位数字。我们可以通过取模运算符(%)来实现这个目标。取模运算符返回两个数相除的余数,所以当我们对一个正整数n和10进行取模运算时,得到的结果就是n的个位数。因此,我们定义了一个函数`get_last_digit`,输入为一个正整数n,输出为n的个位数。在函数内部,我们使用了取模运算符`%`来实现这个目标。最后,我们对函数进行了测试,输入为123,输出为3,符合预期结果。

2、提示信息:

二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。

编程实现:

给定一个正整数N,输出N在二进制表示下1的个数。

例如:N=5,5在二进制表示下为101,故有2个1。

输入描述:

输入一个正整数N

输出描述:

输出N在二进制表示下1的个数


样例输入:

5

样例输出:

2

参考答案:br />对于这个问题,我们可以使用位运算来求解。具体步骤如下:1. 将输入的整数N转化为二进制表示。2. 遍历二进制表示的每一位,统计1的个数。下面是一个使用Python语言实现的例子:```pythondef count_bits(n):count = 0while n:count += n & 1n >>= 1return count# 测试n = 5print(count_bits(n)) # 输出:2```

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

这个问题可以使用位运算来快速求解。首先,我们将输入的整数N转化为二进制表示。然后,我们遍历二进制表示的每一位,统计1的个数。

在Python中,我们可以使用位运算符号`&`和`>>`来实现这个算法。`n & 1`会返回N的二进制表示的最低位,也就是最右边的那一位。如果这一位是1,那么`n & 1`的结果就是1,否则就是0。然后,我们将N右移一位,也就是`n >>= 1`,继续检查下一位。这样,我们就可以在O(logN)的时间内求解出N在二进制表示下1的个数。

这种算法的时间复杂度是O(logN),空间复杂度是O(1),是一种非常高效的算法。

3、编程实现:

给定一个长度为N的列表(N为偶数),请你找出列表中出现次数大于N/2次的元素。

如:N=4,列表为[3,2,3,3],其中列表中出现次数大于2(4/2)的元素为3,故输出3。

输入描述:

输入N个整数,整数之间一个英文逗号隔开,N个整数表示列表中的元素

输出描述:

输出列表中出现次数大于N/2次的元素,如果不存在则输出-1


样例输入:

3,2,3,3

样例输出:

3

参考答案:br />```pythondef find_majority(nums):count_dict = for num in nums:count_dict[num] = count_dict.get(num, 0) + 1N = len(nums)majority_num = -1for num, count in count_dict.items():if count > N // 2:majority_num = numbreakreturn majority_numnums_str = input()nums = nums_str.split(',')nums = [int(num) for num in nums]print(find_majority(nums))```

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

首先,我们定义了一个函数`find_majority`,用于找出列表中出现次数大于N/2次的元素。

在函数中,我们创建了一个字典`count_dict`,用于存储每个元素出现的次数。然后,我们遍历输入的列表`nums`,对于每个元素,我们在`count_dict`中查找该元素,如果找到了,就将其对应的次数加1,否则,就将该元素作为字典的键,并将次数初始化为1。

接着,我们计算列表的长度N,并初始化`majority_num`为-1。然后,我们遍历`count_dict`中的每个元素和对应的次数,如果某个元素的次数大于N/2,就将该元素赋值给`majority_num`,并跳出循环。

最后,我们调用`find_majority`函数,传入输入的列表`nums`,并打印出结果。

在主程序中,我们先从标准输入读取一个字符串`nums_str`,其中包含了输入的N个整数,整数之间用英文逗号隔开。然后,我们调用`split`方法,将`nums_str`分割成一个列表,其中包含了输入的N个整数。接着,我们调用列表推导式,将列表中的字符串元素转换为整数元素。最后,我们调用`find_majority`函数,传入转换后的列表`nums`,并打印出结果。

4、提示信息:

字典序大小,是指字符串中字母在字母表中的先后顺序,即字母表中越靠前的字母,字典序越小。

例如:两个字符串acd和cad,两个字符串的第一个字母分别为"a"和"c",其中"a"在字母表中排在"c"的前边,故字符串acd字典序小与字符串cad。假如第一个字母相同,就比较第二个字母,以此类推。

编程实现:

给定一个长度小于200的字符串S,且字符串中只包含小写字母,然后按照以下要求对字符串S进行去重,并输出去重后的字符串。

要求:

1)如果有重复出现的字母,只保留1个,其他的去掉; 

2)不得改变各字母相对位置;

3)保证去重后的字符串的字典序最小。

例如:

S=“cacd”,重复的字母有c,如果去掉第一个字母c,结果为acd;如果去掉第二个字母c结果为cad,比较两个去重后的结果,第一个结果的字典序小于第二个结果的字典序,故选择去掉第一个c,输出acd。

输入描述:

输入一个长度小于200的字符串S,且字符串中只包含小写字母

输出描述:

按照要求对字符串S进行去重,并输出


样例输入:

cdacd

样例输出:

acd

参考答案:给定字符串为"cdacd",按照题目要求,我们需要去重并保留字典序最小的字符串。观察字符串"cdacd",重复的字母有c和d,其中第一个c在字典序中排在第二个c的前边,第一个d在字典序中排在第二个d的前边。因此,去掉第一个c和第一个d,得到去重后的字符串"acd",其字典序最小。所以,样例输入"cdacd"的样例输出为"acd"。

解析:【喵呜刷题小喵解析】:
对于这道题目,我们需要按照题目要求去重并保留字典序最小的字符串。首先,我们需要找到字符串中重复出现的字母,并确定保留哪一个。根据题目中的提示,我们需要按照字典序大小来确定保留哪一个重复字母。

在本例中,字符串"cdacd"中,字母c和d都出现了两次。根据字典序大小,第一个c和第一个d在字母表中排在第二个c和第二个d的前边。因此,我们需要去掉第二个c和第二个d,保留第一个c和第一个d。

最终,我们得到去重后的字符串"acd",其字典序最小。

需要注意的是,题目中要求不得改变各字母相对位置,因此在去重时,我们需要按照字母在字符串中的顺序来确定保留哪一个重复字母。

5、编程实现:

有一个N*M的矩阵方格,每个方格中都有一个正整数,现从左上角方格出发向右下角方格移动,每次只能向下或向右移动一个方格,请你找出一条最小路径,并输出该路径上的正整数之和。

最小路径:这条路径上的正整数之和最小。

例如:N=2,M=3,2*3的矩阵方格中的正整数如下,

按照移动规则,从左上角方格移动到右下角方格的路径共3条,分别为1->3->5->6,1->3->4->6,1->2->4->6,3条路径上的正整数之和分别为15、14和13,其中正整数之和最小的一条路径是1->2->4->6,和为13,故输出13。

输入描述:

第一行输入两个正整数N和M(2≤N≤100,2≤M≤100),N表示矩阵方格的行数,M表示矩阵方格的列数,两个正整数之间以一个英文逗号隔开

第二行开始输入N行,每行M个正整数(1≤正整数≤200),正整数之间以一个英文逗号隔开

输出描述:

输出一个整数,表示最小路径上的正整数之和


样例输入:

2,3
1,3,5
2,4,6

样例输出:

13

参考答案:```pythondef min_path_sum(matrix):if not matrix:return 0rows, cols = len(matrix), len(matrix[0])dp = [[0] * cols for _ in range(rows)]dp[0][0] = matrix[0][0]for i in range(1, rows):dp[i][0] = dp[i-1][0] + matrix[i][0]for j in range(1, cols):dp[0][j] = dp[0][j-1] + matrix[0][j]for i in range(1, rows):for j in range(1, cols):dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j]return dp[-1][-1]N, M = map(int, input().split(','))matrix = [list(map(int, input().split(','))) for _ in range(N)]print(min_path_sum(matrix))```

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

这个问题可以使用动态规划来解决。首先,我们定义一个二维数组dp,其中dp[i][j]表示从左上角到(i, j)位置的最小路径和。

对于dp[0][0],它只包含一个元素,即matrix[0][0],所以dp[0][0] = matrix[0][0]。

对于dp[0][j],其中j > 0,它表示从左上角到第一行的第j个方格的最小路径和。由于只能向下移动,所以dp[0][j] = dp[0][j-1] + matrix[0][j]。

对于dp[i][0],其中i > 0,它表示从左上角到第i行的第一个方格的最小路径和。由于只能向右移动,所以dp[i][0] = dp[i-1][0] + matrix[i][0]。

对于dp[i][j],其中i > 0且j > 0,它表示从左上角到(i, j)位置的最小路径和。由于只能向下或向右移动,所以dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j]。

最后,返回dp[-1][-1],即从左上角到右下角的最小路径和。

在代码中,我们首先定义了一个函数min_path_sum,它接受一个二维数组matrix作为输入,并返回最小路径和。然后,我们读取输入,将输入的矩阵存储在matrix中,并调用min_path_sum函数来计算最小路径和,最后输出结果。

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

创作类型:
原创

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

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