目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
众数是指一组数据中出现次数量多的那个数,众数可以是多个。
中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数。
查找整型数组中元素的众数并组成一个新的数组,求新数组的中位数。
二、输入描述
输入一个一维整型数组,数组大小取值范围 0<N<1000,数组中每个元素取值范围 0<E<1000。
三、输出描述
输出众数组成的新数组的中位数。
四、解题思路
本体属于送分题,根据题意来解题即可。
众数是指一组数据中出现次数量多的那个数,众数可以是多个。
中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数。
- 输入一行数字,空格分割;
- 定义一个map,记录每个数字出现的次数;
- 找出某数字出现的最大次数;
- 允许出现最大次数的数字为多个,故将其加载到出现最大次数的数字集合maxList;
- 对maxList进行升序排序;
- 如果这组数据的个数是奇数,那最中间那个就是中位数;
- 如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数;
- 输出中位数。
五、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卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。