鱼C论坛

 找回密码
 立即注册
查看: 176|回复: 4

[已解决]第021讲:列表(III)| 课后测试题是不是可以省略不必要的步骤

[复制链接]
发表于 2025-9-11 11:18:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第021讲:列表(III)| 课后测试题
0. 如果有一个列表,其中占比超过一半的元素称之为主要元素,那么如何获取一个列表的主要元素呢?
题目给定的列表是:[2, 2, 4, 2, 3, 6, 2]
为什么不直接写成这样

nums = [2, 2, 4, 2, 3, 6, 2,7]
   
nums.sort()
length = len(nums)
half = nums[length // 2]
if half==nums[0]:
    print("存在主要元素,是:", half)
else:
    print("不存在主要元素")

我认为把列表中的元素排列,只要第一个元素等于nums[length // 2]就可以说第一个元素就可以认定塔是主要元素了呀,为什么还要像答案一样多次一举去再计算一下该数量和列表元素数量的一半相比较呀


最佳答案
2025-9-11 13:37:49
本帖最后由 jackz007 于 2025-9-11 16:19 编辑

      用你的代码试试下面三种情况呢:
  1. nums = [3, 3, 4, 3, 2, 6, 3, 7]
  2. nums = [4, 4, 2, 4, 3, 6, 4, 7]
  3. nums = [6, 6, 4, 6, 3, 2, 6, 7]
复制代码

      看看结果是否还是正确的?
      你的代码只有在主要元素恰好是列表中最小值的时候才是对的,否则,一定是错的!
   
      可以根据 nums 在排序后,与中位数同值元素的数量是否过半进行判断:
  1. nums = [2, 2, 4, 2, 3, 6, 2, 7]
  2. k = (len(nums) - 1) // 2                      # k 为 nums 元素数量的一半,同时,也是 nums 中位数的索引。
  3. nums . sort()
  4. if nums . count(nums[k]) > k :                # 如果 nums 中,nums[k] 的个数过半。
  5.     print('存在主要元素 : %d' % nums[k])
  6. else :
  7.     print('不存在主要元素')
复制代码
主要元素.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-9-11 11:20:04 | 显示全部楼层
你好!关于第021讲的课后测试题,你的思路有一部分是正确的,但代码中存在一些错误,并且逻辑上不够严谨。让我来为你详细解释一下。

首先,你提供的代码有一些语法和逻辑问题:


  1. nums =   # 这里缺少列表的具体元素,例如应该是 nums = [1, 2, 2, 2, 3]
  2.    
  3. nums.sort()
  4. length = len(nums)
  5. half = nums  # 这里应该是取中间位置的元素,例如 half = nums[length // 2]
  6. if half==nums:  # 这里比较的是整个列表,而不是主要元素
  7.     print("存在主要元素,是:", half)
  8. else:
  9.     print("不存在主要元素")
复制代码


你的想法是:排序后,如果列表中间的元素出现的次数超过一半,那么它就是主要元素。这个思路本身没有错,但你的代码实现有误,并且缺少了验证步骤。

为什么需要验证呢?因为即使排序后中间的元素出现次数最多,但它不一定超过列表长度的一半。例如列表 [1, 2, 2, 3, 3],排序后是 [1, 2, 2, 3, 3],中间元素是 2,但它只出现了2次,而列表长度是5,2并不大于2.5,所以不是主要元素。

因此,正确的做法是:
1. 排序后取中间的元素作为候选主要元素。
2. 统计这个候选元素在列表中出现的次数。
3. 判断出现次数是否大于列表长度的一半。

以下是修正后的代码:


  1. nums = [1, 2, 2, 2, 3, 2, 4]  # 示例列表
  2. nums.sort()
  3. length = len(nums)
  4. candidate = nums[length // 2]  # 取中间位置的元素作为候选

  5. # 统计候选元素出现的次数
  6. count = 0
  7. for num in nums:
  8.     if num == candidate:
  9.         count += 1

  10. # 判断是否超过一半
  11. if count > length / 2:
  12.     print("存在主要元素,是:", candidate)
  13. else:
  14.     print("不存在主要元素")
复制代码


另外,还有一种更高效的方法叫做“摩尔投票法”(Boyer-Moore Voting Algorithm),它可以在一次遍历中找到主要元素(如果存在的话),而不需要先排序。如果你感兴趣,可以进一步学习。

总结:你的思路方向是对的,但代码实现有误,并且缺少必要的验证步骤,不能省略。希望这个解释对你有帮助!如果还有疑问,欢迎继续提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-9-11 13:37:49 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2025-9-11 16:19 编辑

      用你的代码试试下面三种情况呢:
  1. nums = [3, 3, 4, 3, 2, 6, 3, 7]
  2. nums = [4, 4, 2, 4, 3, 6, 4, 7]
  3. nums = [6, 6, 4, 6, 3, 2, 6, 7]
复制代码

      看看结果是否还是正确的?
      你的代码只有在主要元素恰好是列表中最小值的时候才是对的,否则,一定是错的!
   
      可以根据 nums 在排序后,与中位数同值元素的数量是否过半进行判断:
  1. nums = [2, 2, 4, 2, 3, 6, 2, 7]
  2. k = (len(nums) - 1) // 2                      # k 为 nums 元素数量的一半,同时,也是 nums 中位数的索引。
  3. nums . sort()
  4. if nums . count(nums[k]) > k :                # 如果 nums 中,nums[k] 的个数过半。
  5.     print('存在主要元素 : %d' % nums[k])
  6. else :
  7.     print('不存在主要元素')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-11 17:19:41 | 显示全部楼层
jackz007 发表于 2025-9-11 13:37
用你的代码试试下面三种情况呢:

      看看结果是否还是正确的?

明白了,是我考虑不周了,感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-9-14 16:57:39 | 显示全部楼层
用sorted(),行不行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-1 07:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表