星雨幽幽 发表于 2025-9-11 11:18:20

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

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

nums =
   
nums.sort()
length = len(nums)
half = nums
if half==nums:
    print("存在主要元素,是:", half)
else:
    print("不存在主要元素")

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


FishC 发表于 2025-9-11 11:20:04

你好!关于第021讲的课后测试题,你的思路有一部分是正确的,但代码中存在一些错误,并且逻辑上不够严谨。让我来为你详细解释一下。

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


nums =   # 这里缺少列表的具体元素,例如应该是 nums =
   
nums.sort()
length = len(nums)
half = nums# 这里应该是取中间位置的元素,例如 half = nums
if half==nums:# 这里比较的是整个列表,而不是主要元素
    print("存在主要元素,是:", half)
else:
    print("不存在主要元素")


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

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

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

以下是修正后的代码:


nums = # 示例列表
nums.sort()
length = len(nums)
candidate = nums# 取中间位置的元素作为候选

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

# 判断是否超过一半
if count > length / 2:
    print("存在主要元素,是:", candidate)
else:
    print("不存在主要元素")


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2025-9-11 13:37:49

本帖最后由 jackz007 于 2025-9-11 16:19 编辑

      用你的代码试试下面三种情况呢:
nums =
nums =
nums =
      看看结果是否还是正确的?
      你的代码只有在主要元素恰好是列表中最小值的时候才是对的,否则,一定是错的!
   
      可以根据 nums 在排序后,与中位数同值元素的数量是否过半进行判断:
nums =
k = (len(nums) - 1) // 2                      # k 为 nums 元素数量的一半,同时,也是 nums 中位数的索引。
nums . sort()
if nums . count(nums) > k :                # 如果 nums 中,nums 的个数过半。
    print('存在主要元素 : %d' % nums)
else :
    print('不存在主要元素')

星雨幽幽 发表于 2025-9-11 17:19:41

jackz007 发表于 2025-9-11 13:37
用你的代码试试下面三种情况呢:

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


明白了,是我考虑不周了,感谢感谢

大山里的都市 发表于 2025-9-14 16:57:39

用sorted(),行不行
页: [1]
查看完整版本: 第021讲:列表(III)| 课后测试题是不是可以省略不必要的步骤