[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第57讲。
被删除的数字,本题是2021年4月24日举办的第12届蓝桥杯青少组Python编程省赛真题,第12届一共有两场省赛,这是第二场。题目要求对于输入的一组正整数,编程帮助小蓝找到被删除的数字。
先来看看题目的要求吧。
一.题目说明
编程实现:
有一组连续正整数,随机乱序后生成一组数据后,小蓝不小心删掉了其中一个数,已知所删掉的这个数不是这组数据中最小的也不是最大的,现在请你编写程序帮助小蓝找到删除的那个数。
输入描述:
按照“编程实现”中的描述模仿输入一组这样的正整数数(正整数之间以英文逗号隔开),在输入的时候少一个数(这个数不是这组数据中最小的也不是最大的),这个数作为小蓝删除掉的那个数,且加上小蓝删除的那个数这组数据是连续的。
输出描述:
输出删除掉的是哪个数
样例输入:
3,2,4,6,7
样例输出:
5
二.思路分析
这是一道简单的题目,考查的知识点主要包括循环、列表和枚举算法。
首先要理解题目的意思,本来应该是一组连续的正整数,比如:
2, 3, 4, 5, 6, 7
调皮的小蓝不小心删除了一个数字5,再打乱顺序,就变成了题目输入的数据:
3, 2, 4, 6, 7
要在无序的数据中找到被删除的数字是非常困难的,但如果数据是有序的,就比较容易了。
所以,第一步就是将输入的无序数据进行排序,变成有序列表。
然后循环遍历列表中的数据,从第2项开始,至倒数第2项结束,因为这个数不是最小的,也不是最大的。
遍历时,可以有如下两种思路:
-
看相邻的两个数据的差是否为1,如果不是,就说明后者就是被删除的数字;
-
使用一个变量start表示起点,设置为第一项,循环时,将start加1,并检查和列表项是否相等,如果不相等,则说明start就是被删除的数字。
我们可以将第一种思路称之为相邻比较法,第二种思路称为自然数法。
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们使用两种方案来编写程序:
-
相邻比较法
-
自然数法
1. 相邻比较法
根据前面的思路分析,编写代码如下:
代码比较简单,注意3个细节:
1). 在获取输入的时候,使用了列表推导式的编程技巧;
2). for...in循环的时候,范围是1~ len(nums),相应的是nums[i]表示后面的列表项,nums[i-1]表示前面的列表项;
3). 一旦找到被删除的数字,要使用break结束循环,以减少不必要的循环。
2. 自然数法
根据前面的思路分析,编写代码如下:
代码比较简单,这里就不再赘述了。
至此,整个程序就全部完成了,你也可以输入不同的数据来测试效果啦。
四.总结与思考
本题代码在8行左右,涉及到的知识点包括:
-
循环语句,主要是for...in;
-
条件语句;
-
输入处理;
-
列表的使用;
本题难度一般,关键是要理解题目的意思,将输入的无序数据变成有序列表,对于有序的数据,要找到被删除的数字就变得非常简单了。
题目虽然比较简单,但是要快速完成,需要熟练掌握Python基础知识,熟悉常用的一些函数和编程技巧。
比如这里的列表推导式,只要是一行输入多个数据,都可以使用这种方式。再比如,这里的sort()函数,可以快速帮助我们完成排序。
超平老师给你留一道思考题,如果小蓝丢失了其中两个数据,你能帮他找出来吗?
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要源码的,可以移步至“超平的编程课”gzh。