python:如果有一个列表[2, 2, 4, 2, 3, 6, 2]&,其中占比超过一半的元素称之为主要元素,那么如何获取一个列表的主要元素呢?

法一:根据主要元素的定义,对列表进行排序操作之后,主要元素必然会出现在列表长度一半之后的一个位置上。oI=w
所以,我们只需要判断列表中是否有超过一半的元素与中间元素相同即可(如果有,中间元素为主要元素;否则,不存在主要元素)。

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("不存在主要元素!")

法二:使用摩尔投票法(Boyer–Moore majority vote)。`5XOv
iv"ycI!'K<}F2)-Ah &joSb
摩尔投票法有时候也被称为“多数投票法”,该算法解决的问题是如何在任意多的候选人中(选票无序),找到获得票数最多的那个。okr
摩尔投票法分为两个阶段:

  • 对抗阶段:分属两个候选人的票数进行两两对抗抵消
  • 计数阶段:计算对抗结果中最后留下的候选人票数是否有效
nums = [2, 2, 4, 2, 3, 6, 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("不存在主要元素。")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值