captaindai 发表于 2024-4-10 18:21:19

列表IV的课后作业动手题

求问,我写的最后一题动手题答案如下
nums =
major1 = major2 = nums
count1 = 0
count2 = 0
# 对抗阶段
for each in nums:
    if major1 == each:
      count1 += 1
      continue
    if major2 == each:
      count2 += 1
      continue
    if count1 == 0:
      major1 = each
      count1 = 1
      continue
    if count2 == 0:
      major2 == each
      count2 = 1
      continue
    count1 -= 1
    count2 -= 1
# 统计阶段
p = nums.count(major1)
q = nums.count(major2)
if p > len(nums) / 3 and q > len(nums) / 3:
    print("主要元素为",major1,"和",major2)
else:
    print("无主要元素")

答案的代码如下
nums =
   
major1 = major2 = nums
count1 = count2 = 0
   
# 对抗阶段
for each in nums:
    if major1 == each:
      count1 += 1
      continue
   
    if major2 == each:
      count2 += 1
      continue
   
    if count1 == 0:
      major1 = each
      count1 = 1
      continue
   
    if count2 == 0:
      major2 = each
      count2 = 1
      continue
   
    count1 -= 1
    count2 -= 1
   
# 统计阶段
if nums.count(major1) > len(nums) / 3:
    print(major1)
if nums.count(major2) > len(nums) / 3:
    print(major2)
为什么我们两个的对抗阶段,major结果会不同

FishC 发表于 2024-4-10 18:21:29

你们两个对抗阶段的代码之间只有一处细微的差别,但这个差别会导致结果不同。

你的代码:
major1 = each

正确代码:
major1 == each

在你的代码中,你将 `major1` 的值直接设置为了 `each` 的值,这是错误的。因为 `major1` 应该是一个元素,表示在列表 `nums` 中出现次数最多的元素,而不是当前循环到的元素。

而在正确代码中,使用了比较运算符 `==` 来判断 `major1` 和 `each` 是否相等,如果相等,则将 `count1` 加 1,否则进入下一个判断。这样可以保证 `major1` 始终指向出现次数最多的元素。

所以,在对抗阶段中,你应该将 `major1 == each` 修改为 `major1 = each`,以确保 `major1` 的值正确更新。

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

jackz007 发表于 2024-4-10 21:38:53

本帖最后由 jackz007 于 2024-4-10 21:47 编辑

第18行有错
      major2 == each
应该改为:
      major2 = each
使用集合可以简化代码:
nums , c = , 0
for x in set(nums):
    if nums . count(x) > len(nums) // 3 :
      print(x)
      c += 1
if c == 0:
    print('无主要元素')
页: [1]
查看完整版本: 列表IV的课后作业动手题