问题描述
给定含有n个元素的多重集合S,每个元素在S中出现的次数叫做该元素的重数,多重数集S中重数最大的元素称为 众数
对于给定的S,求其众数和重数
输入数据由input.txt提供,第一行为S中元素个数n,接下来n行中每行有一个自然数
程序运行结束时,将计算结果输出到文件output.txt中,输出文件有两行,第一行是众数,第二行是重数
分析
思路是先求众数,可以用字典作为辅助。字典的键值key对应列表中元素的位置,字典的value对应各元素的频数。最后遍历获取频数最高元素并输出即可。
源代码
# 给定集合文件input.txt,求众数和众数出现的次数,并输出到output.txt
with open("input1.txt", mode='r') as f1:
n = int(f1.readline())
list1 = f1.read().splitlines()
dic1 = {}
# print(list1)
max = 0 # 默认重数为第一个
def countX(list, x):
# 计算元素在列表中出现的次数
return list.count(x)
for i in range(n):
# 格式化字典
dic2 = {i: 0}
dic1.update(dic2)
for i in range(n):
# 将实验数据录入字典
dic1[i] = countX(list1, list1[i])
for i in range(n):
# 打印实验数据
if dic1[i] >= dic1[max]:
max = i
# print("集合中的众数是{0}它的重数是:{1}".format(list1[max], dic1[max]))
with open('output1.txt', mode='w+') as f2:
f2.write(str(list1[max] + '\n' + str(dic1[max])))
输入输出文件
input1.txt
19
2
4
5
6
7
8
999
9
9
9
9
1
1
1
1
1
1
1
1
output1.txt
1
8
总结
这是一道简单的求众数题,只能起到练习的作用。但是有一个思想很重要,就是善用各种数据结构,能够大大降低算法的资源占用和理解难度。