22 查找众数及中位数

题目描述
众数是指一组数据中出现次数量多的那个数,众数可以是多个。
中位数9是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数。
查找整型数组中元素的众数并组成一个新的数组,求新数组的中位数。

输入描述
输入一个一维整型数组,数组大小取值范围0<N<1000,数组中每个元素取值范围0<E<1000

输出描述
输出众数组成的新数组的中位数

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
 
public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
 
    Integer[] nums =
        Arrays.stream(sc.nextLine().split(" ")).map(Integer::parseInt).toArray(Integer[]::new);
 
    System.out.println(getResult(nums));
  }
 
  public static int getResult(Integer[] nums) {
    HashMap<Integer, Integer> count = new HashMap<>();
 
    // 统计各数字出现次数
    for (int num : nums) {
      count.put(num, count.getOrDefault(num, 0) + 1);
    }
 
    // 获取最大出现次数
    int max = count.values().stream().max((a, b) -> a - b).orElse(0);
 
    // 将众数挑选出来
    ArrayList<Integer> ans = new ArrayList<>();
    for (Integer k : count.keySet()) {
      if (count.get(k) == max) ans.add(k);
    }
 
    // 众数升序
    ans.sort((a, b) -> a - b);
 
    // 中位数取值
    int mid = ans.size() / 2;
    if (ans.size() % 2 == 0) {
      // 偶数个数时,取中间两个位置的平均值
      return (ans.get(mid) + ans.get(mid - 1)) / 2;
    } else {
      // 奇数个数时,取中间位置的值
      return ans.get(mid);
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值