标签:数组

题目:查找众数及中位数

查找整型数组中元素的众数并组成一个新的数组,求新数组的中位数

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

题解

思路:

  1. 使用字典存放每个元素出现的次数
  2. 对次数取最大值,并与字典的元素值匹配,获取到众数列表,仅进行排序
  3. 对众数列表求中位数。如果个数为奇数,中位数为列表中间的数字;否则为中间两个数的平均数
"""
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])