(小甲鱼列表III编程)0. 如果有一个列表,其中占比超过一半的元素称之为主要元素,那么如何获取一个列表的主要元素呢?1. 其实上面这道题有一个经典的解法,就是使用摩尔投票法

一、如果有一个列表,其中占比超过一半的元素称之为主要元素,那么如何获取一个列表的主要元素呢?题目给定的列表是:[2, 2, 4, 2, 3, 6, 2]。请根据解题思路进行编程。

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

答案代码:

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

结果:

存在主要元素,是: 2

我的代码:
我的代码思路:
列表已经给定,而我们现在需要找的是列表中的主要元素(列表中元素出现最多的元素,并且它的个数还需要大于列表的一般元素)。先给列表进行排序,找到列表的长度,看列表中中心位置的元素出现了几次,如果出现的次数大于列表长度的一半,则这个元素就是中心元素。

代码1

s=[2,2,4,2,3,6,2]
s.sort()
x=len(s)

for i in s:
    if i!=s[(int(x/2))]:
        continue
    else:  
        m=s.count(i)
        break 
        
if m>(x//2):
    print(i,"是主要元素")

代码2:

s=[2,2,4,2,3,6,2]

s.sort()
x=len(s)

n=s[x//2]
m=s.count(s[x//2])

if m>(x-m):
    print(n,"是主要元素")

二、其实上面这道题有一个经典的解法,就是使用摩尔投票法(Boyer–Moore majority vote)。摩尔投票法有时候也被称为“多数投票法”,该算法解决的问题是如何在任意多的候选人中(选票无序),找到获得票数最多的那个。摩尔投票法分为两个阶段:

对抗阶段:分属两个候选人的票数进行两两对抗抵消

计数阶段:计算对抗结果中最后留下的候选人票数是否有效

提示思路:大家不妨可以将摩尔投票法的工作原理想象为诸侯争霸,假设每个国家都是全民皆兵,并且打起仗来都是以 1 换 1 的形式消耗人口,当一个国家人口总数为 0,那么 Gameover,OK,如果某国人口数量超过所有国家总人口的一半,最终赢家就肯定是它。

答案代码:

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

结果:

主要元素是: 2

我的代码:
我的代码思路:
我的代码前面和答案代码相似,先遍历s列表,将s列表中多个不同的数字存储在一个新的列表m里面,接下来通过s.count()计算这些不同元素的个数,最后将它们的个数与s列表长度的一半进行比较,如果大于s列表的一半(len(s)//2),则说明其是主要元素。

s=[2,2,3,5,2,3,2]         #这个列表是我随机取得,所以可能和上面答案代码里的列表不一样。
m=[]
for i in s:
    if i in m:
        
        continue
    else :
        m.append(i)
print(m)        #[2, 3, 5, 6, 8, 9]

n=int(len(s))
for j in m:
    if j in s:
        x=s.count(j)
        print(x,end=" ")
        if x>(n//2):
            print(j,"是最多票数")
        else :
            print(j,"不是最多票数")
    
    else :
        break

结果:

[2, 3, 5]
4 2 是最多票数
2 3 不是最多票数
1 5 不是最多票数

本博客题目来自链接: 小甲鱼列表III编程

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值