鱼C论坛

 找回密码
 立即注册
查看: 2066|回复: 6

[已解决]小甲鱼的动手题我又不会理解了 请求大佬帮助哦

[复制链接]
发表于 2023-4-11 18:09:04 | 显示全部楼层 |阅读模式

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

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

x
nums = [2,2,4,2,3,6,2,7,7,7,7,7]


major1 = major2 = nums[0]
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
    else:
        count1 -= 1
        count2 -= 1
   

if nums.count(major1) > len(nums) / 3:
    print(major1)
if nums.count(major2) > len(nums) / 3:
    print(major2)
   
  在我这段代码里面 很显然最后会输入7 但是我理解不了 按照我认为的代码逻辑应该是从上往下处理 那么对于前三个元素 后面major不是就被赋值为4了吗,然后count2变成了1 然后到了2 然后count1 += 1了 然后又重新循环到了3 都不满足count1 == 2了 count2 == 0了 到了下一个6 count2又被赋值为1,然后到下一个2 count1 == 3了,到了下一个7 都不满足 然后各减1 count2 == 0了 以此类推 最后满足7的major2 只能是4次 然而count2 最后只能==4 不是吗? 然后最后会等于1 / 3 然而代码输出还是7 我用眼睛看也是7出现五次 但是我理解为4次 我不知道要怎样去理解了
最佳答案
2023-4-11 18:31:25
lhy12343 发表于 2023-4-11 18:24
count2为4就说明7出现了4次 那么我数了一下n == 12次 那么就不会大于n/3啊 而且大佬, 当遍历到第一个7的时 ...

首先,major1 和 major2 不仅仅是计数,它们还在追踪潜在的出现次数大于 n/3 的元素。当遍历到最后一个元素时,major1 和 major2 可能已经找到了出现次数大于 n/3 的元素,但它们的 count1 和 count2 并不一定反映这两个元素的实际出现次数。

在遍历结束后,我们需要使用 nums.count(major1) 和 nums.count(major2) 来获取 major1 和 major2 的实际出现次数。这是因为在遍历过程中,我们只是尽量保持 count1 和 count2 不为 0,而不是精确地统计 major1 和 major2 的出现次数。

所以,在遍历结束后,我们需要再次计算 major1 和 major2 的出现次数,并与 n/3 进行比较。在这个例子中,major1 为 2,major2 为 7,然后我们分别计算它们的实际出现次数:nums.count(2) 为 5,nums.count(7) 为 5。因为 5 > 12/3,所以最后打印输出 2 和 7。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-11 18:12:12 | 显示全部楼层
ai告诉我 是因为if major1 == each 如果不成立就会使count1 -= 1 但是如果这个if语句不成立那不是还有三个if语句吗  要先判断三个if语句才能最后去判断count1 是否减1啊 我是这样理解的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-11 18:15:24 | 显示全部楼层
这段代码的目的是找到一个数组中出现次数大于 n/3 的元素,其中 n 是数组的长度。这里使用了 Boyer-Moore Majority Vote algorithm 的变种。

首先,我们逐步分析代码:

1、初始化两个 major 变量和两个 count 变量,都设置为数组的第一个元素。
2、遍历数组中的每个元素,进行以下操作:
a. 如果当前元素等于 major1,则 count1 加 1。
b. 如果当前元素等于 major2,则 count2 加 1。
c. 如果 count1 为 0,将当前元素赋值给 major1,并将 count1 设为 1。
d. 如果 count2 为 0,将当前元素赋值给 major2,并将 count2 设为 1。
e. 如果当前元素既不等于 major1 也不等于 major2,且 count1 和 count2 都不为 0,则 count1 和 count2 各减 1。
3、最后,检查 major1 和 major2 的出现次数是否大于 n/3,如果满足条件,则打印相应的 major 值。

现在,让我们分析你提到的问题。当遍历到第一个 7 时,major1 为 2,major2 为 4,count1 为 3,count2 为 1。此时,7 既不等于 major1 也不等于 major2,所以 count1 和 count2 各减 1,变成 count1 为 2,count2 为 0。

遍历到第二个 7 时,因为 count2 为 0,所以将 major2 赋值为 7,并将 count2 设为 1。继续遍历数组,major2 和 count2 会保持不变,直到遇到第三个 7。此时,major1 为 2,major2 为 7,count1 为 1,count2 为 1。第三个 7 使 count2 变为 2,接下来遇到的两个 7 会使 count2 变为 4。

所以,最后 major1 为 2,major2 为 7,count1 为 1,count2 为 4。然后检查 major1 和 major2 的出现次数是否大于 n/3,因为 7 的出现次数大于 n/3,所以打印输出 7。

希望这个解释能帮助你理解这段代码的工作原理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-11 18:24:32 | 显示全部楼层
count2为4就说明7出现了4次 那么我数了一下n == 12次 那么就不会大于n/3啊 而且大佬, 当遍历到第一个7的时候 major2并不是为4 而是为6 这倒不是问题 问题是最后我判断它并不会大于n/3 因为count2 == 12/3 == 4

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-11 18:31:25 | 显示全部楼层    本楼为最佳答案   
lhy12343 发表于 2023-4-11 18:24
count2为4就说明7出现了4次 那么我数了一下n == 12次 那么就不会大于n/3啊 而且大佬, 当遍历到第一个7的时 ...

首先,major1 和 major2 不仅仅是计数,它们还在追踪潜在的出现次数大于 n/3 的元素。当遍历到最后一个元素时,major1 和 major2 可能已经找到了出现次数大于 n/3 的元素,但它们的 count1 和 count2 并不一定反映这两个元素的实际出现次数。

在遍历结束后,我们需要使用 nums.count(major1) 和 nums.count(major2) 来获取 major1 和 major2 的实际出现次数。这是因为在遍历过程中,我们只是尽量保持 count1 和 count2 不为 0,而不是精确地统计 major1 和 major2 的出现次数。

所以,在遍历结束后,我们需要再次计算 major1 和 major2 的出现次数,并与 n/3 进行比较。在这个例子中,major1 为 2,major2 为 7,然后我们分别计算它们的实际出现次数:nums.count(2) 为 5,nums.count(7) 为 5。因为 5 > 12/3,所以最后打印输出 2 和 7。

点评

我很赞同!: 5.0 不,我坚决不同意楼主的看法!: 5.0
我很赞同!: 5 不,我坚决不同意楼主的看法!: 5
  发表于 2023-4-11 19:57
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-11 19:57:45 | 显示全部楼层
isdkz 发表于 2023-4-11 18:31
首先,major1 和 major2 不仅仅是计数,它们还在追踪潜在的出现次数大于 n/3 的元素。当遍历到最后一个元 ...

好的 谢谢大佬 我懂了=w=
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-29 09:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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