标签:数组
题目:查找众数及中位数
查找整型数组中元素的众数并组成一个新的数组,求新数组的中位数
1. 众数是指一组数据中出现次数量多的那个数,众数可以是多个
2. 中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数
- 输入描述:
输入一个一维整型数组,数组大小取值范围 0<N<1000,数组中每个元素取值范围 0<E<1000
- 输出描述:
输出众数组成的新数组的中位数
示例1:
输入
10 11 21 19 21 17 21 16 21 18 15
输出
21
示例2:
输入
2 1 5 4 3 3 9 2 7 4 6 2 15 4 2 4
输出
3
示例3:
输入
5 1 5 3 5 2 5 5 7 6 7 3 7 11 7 55 7 9 98 9 17 9 15 9 9 1 39
输出
7
题解
思路:
- 使用字典存放每个元素出现的次数
- 对次数取最大值,并与字典的元素值匹配,获取到众数列表,仅进行排序
- 对众数列表求中位数。如果个数为奇数,中位数为列表中间的数字;否则为中间两个数的平均数
"""
import math
import sys
for line in sys.stdin:
nums = line.split()
# 用字典存放每个元素出现的数量
has_map = {}
for num in nums:
if num in has_map:
has_map[num] = has_map[num] + 1
else:
has_map[num] = 1
# 获取最大的次数
max_num = max([has_map[num] for num in has_map])
# 将出现次数最多的元素组成新的数组、并进行排序,获得从小到大排序的众数列表
max_nums = [int(num) for num in has_map if has_map[num] == max_num]
max_nums.sort()
# 返回中位数
if len(max_nums) % 2 == 0 and len(max_nums) != 1:
index2 = len(max_nums) // 2 # 求商
index1 = index2 - 1
print(int((max_nums[index1] + max_nums[index2]) / 2))
else:
print(max_nums[math.ceil(len(max_nums) / 2) - 1])