鱼C论坛

 找回密码
 立即注册
查看: 351|回复: 3

第021讲:列表(III)代码题为什么不能这样写

[复制链接]
发表于 2024-6-15 15:25:50 | 显示全部楼层 |阅读模式

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

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

x
s = [3, 4, 4, 2, 3, 4, 2]


for i in s:
    if s.count(i)>=len(s)//2:
        print("中间元素",i,"为主要元素。")
        break
else:
    print("不存在主要元素")

我这样写代码程序也会运行出同样的结果,为什么答案分了两种方法,一种是判断列表中是否有超过一半的元素与中间元素相同,另一种是找到个数最多的那个。
答案如下:
【方法一】
nums = [2, 2, 4, 2, 3, 6, 2]

   

nums.sort()

length = len(nums)

half = nums[length // 2]

count = 0

   

for each in nums:

    if each == half:

        count += 1

if count > length / 2:

    print("存在主要元素,是:", half)

else:

    print("不存在主要元素!")
【方法二】
nums = [2, 2, 4, 2, 3, 6, 2]

   

# 对抗阶段

major = nums[zxsq-anti-bbcode-0]

count = 0

for each in nums:

    if count == 0:

        major = each

    if each == major:

        count += 1

    else:

        count -= 1

   

# 统计阶段

if nums.count(major) > len(nums) / 2:

    print("主要元素是:", major)

else:

    print("不存在主要元素。")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-15 15:26:40 | 显示全部楼层
你的代码其实有一些问题,主要是你在定义`nums`和`s`变量时没有对其进行初始化,使得代码无法正常运行。还有,你的代码逻辑其实并未完全实现寻找主要元素的功能。下面我会对你的代码进行修正,并提供方法一和方法二的完整代码,让你更好地理解为什么这些方法是正确的。

首先,让我们看一下你修改后的代码:
s = [1, 2, 3, 2, 2, 2, 5, 2]

for i in s:
    if s.count(i) >= len(s) // 2:
        print("中间元素", i, "为主要元素。")
        break
else:
    print("不存在主要元素")

这里的代码在逻辑上确实可以判断题目要求的内容,但效率较低,因为每次循环都要对整个列表进行计数操作。接下来我们看看方法一。

### 方法一
nums = [1, 2, 3, 2, 2, 2, 5, 2]

nums.sort()

length = len(nums)

half = nums[length // 2]

count = 0

for each in nums:
    if each == half:
        count += 1

if count > length / 2:
    print("存在主要元素,是:", half)
else:
    print("不存在主要元素!")

这个方法先将列表排序,然后取出排序后中间位置的元素,统计这个元素在列表中出现的次数。如果出现次数超过一半,则认为它是主要元素。其核心在于排序后的列表,如果有一个主要元素,它一定会出现在中间位置。

### 方法二
nums = [1, 2, 3, 2, 2, 2, 5, 2]

# 对抗阶段
major = nums[0]
count = 0

for each in nums:
    if count == 0:
        major = each
    if each == major:
        count += 1
    else:
        count -= 1

# 统计阶段
if nums.count(major) > len(nums) / 2:
    print("主要元素是:", major)
else:
    print("不存在主要元素。")

这个方法利用了著名的“摩尔投票算法”,基本思想是在列表中找到一个候选的主要元素。最终阶段再统计这个候选元素的次数,确认是否为主要元素。其核心在于计数机制,消除了不必要的元素,最后剩下的候选元素可能是主要元素。

总结:
- 你的初始代码由于未初始化变量无法运行,还存在效率问题。
- 方法一通过排序后的中间元素进行统计,直接高效。
- 方法二利用摩尔投票算法,先选出一个候选元素,再进行最终确认,复杂度更低。

希望这些解释能帮你更好地理解代码中的逻辑和不同方法的优劣。加油,你会越来越棒的!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-15 16:39:30 | 显示全部楼层

答案只是两种不同的解决问题的方法,只要能实现最终效果,什么样的代码都行~!

黑猫白猫,能抓到耗子就是好猫!

你的方法实际上类似于第二种,但是你是在遍历列表时

立即判断当前元素是否为主要元素,而不是像答案先找到一个候选元素再统计
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-23 14:11:17 | 显示全部楼层
区别主要是:
      你的代码和方法一都是直接检查每个元素的出现次数,而方法二使用了一个更复杂的算法来首先缩小可能的主要元素的范围
         你的代码和方法一不要求列表是有序的,而方法一需要先对列表进行排序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 20:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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