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);
}
}
总结:此题关键在于将数值和出现次数对应起来。要习惯这种思路!