刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

36.统计高分问题
小张在学习对分查找后,想利用该思路来实践一下,加深对该算法的理解。于是他按老师的要求,统计期末考试成绩,总分比他高的同学有多少个?
他的思路是,首先将全区所有学生的成绩降序排序,然后利用对分查找思想解决。他编写的代码如下,请完善划线处的代码。
cj =[654,643,621,612,609,606,...]#学生成绩存列表cj并已经降序排序
def dfsearch(key):
i =0; j=len(cj)-1
while i<=j:
m =(i+j)//2
if cj[m]>key:

else:
j-= 1
return ②
key = int(input('输入待查找的成绩'))
pos = ③
print('高于',key,'分的人数有',pos)

使用微信搜索喵呜刷题,轻松应对考试!

答案:

1. ①处应填:i = m + 12. ②处应填:return j3. ③处应填:dfsearch(key)

解析:

【喵呜刷题小喵解析】:

这道题目考查了对分查找算法的应用。小张想要统计全区成绩比自己高的学生数量,可以首先对成绩进行降序排序,然后利用对分查找的思想,从列表的中间位置开始查找,如果中间位置的成绩大于自己,那么说明自己之前的所有学生成绩都大于自己,只需要返回j(即中间位置)即可;如果中间位置的成绩小于自己,那么说明自己之前肯定没有比自己高的成绩,那么自己应该在中间位置之后的位置,于是可以将搜索范围缩小到中间位置的右边,重复以上步骤。

所以,根据以上思路,我们可以得出以下代码:


```python
cj =[654,643,621,612,609,606,...] #学生成绩存列表cj并已经降序排序
def dfsearch(key):
i =0; j=len(cj)-1
while i<=j:
m =(i+j)//2
if cj[m]>key:
i = m + 1 # 如果中间位置的成绩大于key,将搜索范围缩小到m的右边
else:
j-= 1 # 如果中间位置的成绩小于key,将搜索范围缩小到m的左边
return j # 最终返回j,即成绩大于key的最后一个位置,也就是成绩大于key的学生数量

key = int(input('输入待查找的成绩'))
pos = dfsearch(key)
print('高于',key,'分的人数有',pos)
```
其中,①处应填:i = m + 1,表示将搜索范围缩小到m的右边;
②处应填:return j,表示返回成绩大于key的最后一个位置,也就是成绩大于key的学生数量;
③处应填:dfsearch(key),表示调用函数进行对分查找。
创作类型:
原创

本文链接:36.统计高分问题小张在学习对分查找后,想利用该思路来实践一下,加深对该算法的理解。于是他按老师的要

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

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share