xiaozhuzhu12138 发表于 2023-4-15 11:11:55

有大佬解答一下 当满足第一个if条件后是continue执行后后面的if和count-=1都不执行...

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)

xiaozhuzhu12138 发表于 2023-4-15 11:12:34

主要就是continue跳出这一层循环给我整懵了

sfqxx 发表于 2023-4-15 11:12:45

本帖最后由 sfqxx 于 2023-4-15 11:18 编辑

在这段代码中,`continue`语句用于跳过当前循环,直接进入下一次循环。在对抗阶段中,当判断当前数值与major1或major2相等时,就会执行continue语句,不再执行后续的代码。这样做的目的是为了避免重复计数。

举个例子,假如在nums列表中有三个数值为1,如果不使用continue语句,每次遇到1都会进行计数操作,导致最终major1的计数值可能会超过实际出现次数,从而影响到统计阶段的结果。

因此,continue语句在这里的作用就是跳过已经计数过的数值,确保每个数值只被计数一次,最终得出正确的major1和major2。
有用请设置最佳答案

歌者文明清理员 发表于 2023-4-15 11:14:41

本帖最后由 歌者文明清理员 于 2023-4-15 11:22 编辑

continue是直接下一次循环。如果下一次循环条件不满足,退出循环
https://t3.wodetu.cn/2023/04/08/7408df3fbffa9f5551168a8d38de45d5.png

歌者文明清理员 发表于 2023-4-15 11:16:01

sfqxx 发表于 2023-4-15 11:12
这段代码的作用是找到在列表 nums 中出现次数超过三分之一的主要元素。代码中使用了 boyer-moore 投票算法 ...

他的问题是:continue 不理解
标题和二楼的也要复制,不能只复制个代码

sfqxx 发表于 2023-4-15 11:18:38

歌者文明清理员 发表于 2023-4-15 11:16
他的问题是:continue 不理解
标题和二楼的也要复制,不能只复制个代码

改了

isdkz 发表于 2023-4-15 11:18:45

当执行到 continue 语句时,它会跳过当前循环体剩下的部分,然后直接进入下一次循环。

在你的代码中,如果满足了任何一个 if 语句条件并执行了 continue,那么在当前循环体内,后面的 if 语句和 count1 -= 1、count2 -= 1 都不会执行。

具体来说,代码的执行流程如下:


[*]对每一个 each 在 nums 中进行遍历。
[*]如果 each 等于 major1,那么 count1 加 1,然后直接跳到下一个 each 的循环,忽略剩下的代码。
[*]如果 each 等于 major2,那么 count2 加 1,然后直接跳到下一个 each 的循环,忽略剩下的代码。
[*]如果 count1 等于 0,那么设置 major1 为 each,将 count1 设置为 1,然后直接跳到下一个 each 的循环,忽略剩下的代码。
[*]如果 count2 等于 0,那么设置 major2 为 each,将 count2 设置为 1,然后直接跳到下一个 each 的循环,忽略剩下的代码。
[*]如果以上条件都不满足,执行 count1 -= 1 和 count2 -= 1,然后进入下一个 each 的循环。


简单来说,如果一个 if 条件满足并执行了 continue,那么当前循环体内剩下的代码都不会被执行。而是直接进入下一次循环。

歌者文明清理员 发表于 2023-4-15 11:18:56

sfqxx 发表于 2023-4-15 11:18
改了

改了有啥用

sfqxx 发表于 2023-4-15 11:19:11

歌者文明清理员 发表于 2023-4-15 11:18
改了有啥用

陶远航 发表于 2023-4-15 16:37:41

这段代码是一个求解一个数组中出现次数超过1/3的众数的算法。该算法使用了摩尔投票算法的思想。

在对抗阶段中,算法遍历整个数组,对于每个数,首先判断它是否和当前候选的两个数(major1和major2)相等,如果相等,就把对应的计数器(count1或count2)加一,然后跳过后面的代码继续处理下一个数。如果该数不等于当前的任何一个候选数,就尝试更新候选数,如果其中一个计数器为0,就用该数替换对应的候选数,并将对应的计数器设置为1。如果两个计数器都不为0,则说明当前的两个候选数都没有达到出现次数超过1/3的要求,因此将它们的计数器都减1,相当于同时从候选数中删除了一个。

如果遍历完整个数组后,major1和major2中有一个数的出现次数超过了1/3,则在统计阶段中打印该数。

回到你的问题,如果满足第一个if条件,即major1等于当前的数each,就会执行count1 += 1,然后执行continue跳过后面的代码。因此,如果第一个if条件成立,后面的所有代码都不会被执行。同理,如果满足第二个if条件,即major2等于当前的数each,也会执行类似的操作,跳过后面的代码。因此,这两个if语句的作用是防止重复计数,即遇到已经被选为候选数的数时,直接跳过。

xiaozhuzhu12138 发表于 2023-4-15 19:35:43

isdkz 发表于 2023-4-15 11:18
当执行到 continue 语句时,它会跳过当前循环体剩下的部分,然后直接进入下一次循环。

在你的代码中,如 ...

感谢大佬解惑

isdkz 发表于 2023-4-15 19:38:33

xiaozhuzhu12138 发表于 2023-4-15 19:35
感谢大佬解惑

如果答案对你有帮助的话,给个最佳答案呗{:5_92:}
页: [1]
查看完整版本: 有大佬解答一下 当满足第一个if条件后是continue执行后后面的if和count-=1都不执行...