查找众数

问题

查找众数

代码

import java.util.*;

public class Test {

    public static void main(String[] args) {
        int[] arr = {0, 3,3, 3, 1,4, 4};

        List<Integer> modalNums=getModalnums(arr);
        System.out.println(modalNums);
    }
    //main是静态方法,getModalnums是成员方法,成员方法无法在静态方法中被调用,所以加static
    public static List<Integer> getModalnums(int[] arr)
    {
        int n=arr.length;
        if(n==0)
            return Collections.emptyList();
        if(n==1)
            return Collections.singletonList(arr[0]);


        Map<Integer,Integer> freqMap=new HashMap<>();
        //键为数,值为频率
        for(int value:arr)//统计数组中每个数出现的频率
        {
            Integer v=freqMap.get(value);//取key
            freqMap.put(value,v==null?1:v+1);
            //如果插入成功,会返回null,如果重复,就会返回这个键之前对应的值
        }
        //将freqmap中所有的键对值,放入一个Arraylist

        List<Map.Entry<Integer,Integer>> entries =new ArrayList<>(freqMap.entrySet());
        entries.sort((e1, e2) -> e2.getValue() - e1.getValue());//如果e2.getValue() - e1.getValue()>0,则返回1,不交换,<0,返回-1,交换
        List<Integer> modalNums=new ArrayList<>();
        modalNums.add(entries.get(0).getKey());//排序后第一个entry键是一个众数

        int size = entries.size();
        for (int i = 1; i < size; i++) {
            // 如果之后的 entry 与第一个 entry 的 value 相等,那么这个 entry 的键也是众数
            if (entries.get(i).getValue().equals(entries.get(0).getValue())) {
                modalNums.add(entries.get(i).getKey());
            }
            else {
                break;
            }
        }
        return modalNums;
    }

}

map就是一个key一个value,数字本身作为key,数字出现次数作为value,然后排序,找到最大的value对应的key,然后输出
全是套用的现成的方法
查找众数_第1张图片

你可能感兴趣的:(算法,Java)