一、如果有一个列表,其中占比超过一半的元素称之为主要元素,那么如何获取一个列表的主要元素呢?题目给定的列表是:[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编程