华为OD机试 - 查找众数及中位数(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

众数是指一组数据中出现次数量多的那个数,众数可以是多个。

中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数。

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

二、输入描述

输入一个一维整型数组,数组大小取值范围 0

三、输出描述

输出众数组成的新数组的中位数。

四、解题思路

本体属于送分题,根据题意来解题即可。

众数是指一组数据中出现次数量多的那个数,众数可以是多个。
中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数。

  1. 输入一行数字,空格分割;
  2. 定义一个map,记录每个数字出现的次数;
  3. 找出某数字出现的最大次数;
  4. 允许出现最大次数的数字为多个,故将其加载到出现最大次数的数字集合maxList;
  5. 对maxList进行升序排序;
  6. 如果这组数据的个数是奇数,那最中间那个就是中位数;
  7. 如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数;
  8. 输出中位数。

五、Java算法源码

package com.guor.od;

import java.util.*;

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

        /**
         * key:数字
         * value:该数字出现的次数
         */
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        // 数字出现的最大次数
        int timeMax = 0;
        for (String s : sc.nextLine().split(" ")) {
            Integer sInt = Integer.valueOf(s);
            // 如果map中存在此数字,则数量+1
            if (map.containsKey(sInt)) {
                Integer temp = map.get(sInt) + 1;
                // 获取数字出现的最大次数
                if (temp > timeMax) {
                    timeMax = temp;
                }
                map.put(sInt, temp);
            } else {
                map.put(sInt, 1);
            }
        }

        // 出现最大次数的数字集合
        List<Integer> maxList = new ArrayList<Integer>();
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (timeMax == entry.getValue()) {
                for (int i = 0; i < timeMax; i++) {
                    maxList.add(entry.getKey());
                }
            }
        }

        /**
         * 中位数是指把一组数据从小到大排列,最中间的那个数
         * 对其进行升序排序
         */
        maxList.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer arg0, Integer arg1) {
                if (arg0 < arg1) {
                    return -1;
                } else if (arg0 > arg1) {
                    return 1;
                } else {
                    return 0;
                }
            }
        });

        System.out.println("出现最大次数的数字集合:"+maxList);

        int middle = 0;
        // 如果这组数据的个数是奇数,那最中间那个就是中位数
        if (maxList.size() % 2 == 1) {
            middle = maxList.get(maxList.size() / 2);
        } else {
            // 如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数
            middle = (maxList.get(maxList.size() / 2) + maxList.get(maxList.size() / 2 - 1)) / 2;
        }
        System.out.println(middle);
    }
}

六、效果展示

1、输入

10 22 26 58 35 22 10 26 10 22 35 35 55 100 99 15 17 21

2、输出

22

3、说明

出现最大次数的数字集合:[10, 10, 10, 22, 22, 22, 35, 35, 35]

华为OD机试 - 查找众数及中位数(Java 2023 B卷 100分)_第1张图片


下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,安全,web安全,网络安全,黑客)