lhy12343 发表于 2023-4-11 18:09:04

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

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
    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次 我不知道要怎样去理解了

lhy12343 发表于 2023-4-11 18:12:12

ai告诉我 是因为if major1 == each 如果不成立就会使count1 -= 1 但是如果这个if语句不成立那不是还有三个if语句吗要先判断三个if语句才能最后去判断count1 是否减1啊 我是这样理解的

isdkz 发表于 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。

希望这个解释能帮助你理解这段代码的工作原理。

lhy12343 发表于 2023-4-11 18:24:32

count2为4就说明7出现了4次 那么我数了一下n == 12次 那么就不会大于n/3啊 而且大佬, 当遍历到第一个7的时候 major2并不是为4 而是为6 这倒不是问题 问题是最后我判断它并不会大于n/3 因为count2 == 12/3 == 4

isdkz 发表于 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。

lhy12343 发表于 2023-4-11 19:57:45

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

好的 谢谢大佬 我懂了=w=
页: [1]
查看完整版本: 小甲鱼的动手题我又不会理解了 请求大佬帮助哦