26.众数平均值问题

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

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

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

示例一
输入:
10 11 21 19 21 17 21 16 21 18 16
输出
21

示例二
输入
2 1 5 4 3 3 9 2 7 4 6 2 15 4 2 4
输出
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 java.util.*;

public class Demo26 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String[] split = sc.nextLine().split(" ");

        int len = split.length;
        int[] ints = new int[len];
        for(int i = 0; i < len; i++)
            ints[i] = Integer.parseInt(split[i]);
        Arrays.sort(ints);

        //用HashMap将数值和出现的次数对应起来
        HashMap<Integer, Integer> map = new HashMap<>();
        int key = ints[0];
        int count = 1;
        for(int i = 1; i < len; i++){
            if(ints[i] == key) count++;  //好活!!
            else{
                map.put(key, count);
                key = ints[i];
                count = 1;
            }
        }
        map.put(key, count);  //这个别漏了,要分析好 for循环

        ArrayList<Integer> list = new ArrayList<>(map.values());
        list.sort((o1, o2) -> o2 - o1);
        int max = list.get(0); //找到出现频率最高的次数

        ArrayList<Integer> res = new ArrayList<>();
        for(Map.Entry<Integer, Integer> entry : map.entrySet()){
            if(entry.getValue() == max)
                res.add(entry.getKey());
        }
        res.sort((o1, o2) -> o1 - o2); //为求中位数将符合要求的的数据排个序

        int ans;
        if(res.size() % 2 == 0){
            int half = res.size() / 2;
            ans = (res.get(half) + res.get(half - 1)) / 2;
        }else{
            ans = res.get((res.size() - 1) / 2);
        }
        System.out.println(ans);
    }
}

总结:此题关键在于将数值和出现次数对应起来。要习惯这种思路!

 

posted @ 2022-03-26 20:31  Jukim  阅读(389)  评论(0编辑  收藏  举报