在 Java 中编写一个模式方法,以查找数组中最常出现的元素

2022-09-03 14:28:29

问题是:

编写一个名为 mode 的方法,该方法返回整数数组中最常出现的元素。假定数组至少有一个元素,并且数组中的每个元素都有一个介于 0 和 100 之间的值(包括 0 和 100)。通过选择较低的值来打破关系。

例如,如果传递的数组包含值 {27, 15, 15, 11, 27},则方法应返回 15。(提示:您可能希望查看本章前面的Tally程序,以了解如何解决此问题。

下面是我的代码,除了单元素数组之外,它几乎有效

public static int mode(int[] n)
{
    Arrays.sort(n);
    
    int count2 = 0;
    int count1 = 0;
    int pupular1 =0;
    int popular2 =0;
    
    
    for (int i = 0; i < n.length; i++)
    {
            pupular1 = n[i];
            count1 = 0;    //see edit
        
        for (int j = i + 1; j < n.length; j++)
        {
            if (pupular1 == n[j]) count1++;
        }
        
        if (count1 > count2)
        {
                popular2 = pupular1;
                count2 = count1;
        }
        
        else if(count1 == count2)
        {
            popular2 = Math.min(popular2, pupular1);
        }
    }
    
    return popular2;
}

编辑:终于想通了。更改为现在一切工作!count1 = 0;count1 = 1;


答案 1

对于此类问题,您应该使用哈希映射。将每个元素输入哈希图需要 O(n) 时间,将 o(1) 检索元素需要 o(n) 时间。在给定的代码中,我基本上是取一个全局最大值,并将其与从哈希映射的“get”上收到的值进行比较,每次我在其中输入元素时,请看一下:

hashmap有两部分,一个是键,第二个是值,当你对键做一个get操作时,它的值被返回。

public static int mode(int []array)
{
    HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();
    int max  = 1;
    int temp = 0;

    for(int i = 0; i < array.length; i++) {

        if (hm.get(array[i]) != null) {

            int count = hm.get(array[i]);
            count++;
            hm.put(array[i], count);

            if(count > max) {
                max  = count;
                temp = array[i];
            }
        }

        else 
            hm.put(array[i],1);
    }
    return temp;
}

答案 2

您应该能够在 N 次操作中执行此操作,这意味着只需一次操作,O(n) 次。

使用 map 或 int[](如果问题仅针对 ints)来递增计数器,并且还使用一个变量来保留具有最大计数的键。每次递增计数器时,询问值是什么,并将其与上次使用的键进行比较,如果值较大,请更新键。

public class Mode {
public static int mode(final int[] n) {
    int maxKey = 0;
    int maxCounts = 0;

    int[] counts = new int[n.length];

    for (int i=0; i < n.length; i++) {
        counts[n[i]]++;
        if (maxCounts < counts[n[i]]) {
            maxCounts = counts[n[i]];
            maxKey = n[i];
        }
    }
    return maxKey;
}

public static void main(String[] args) {
    int[] n = new int[] { 3,7,4,1,3,8,9,3,7,1 };
    System.out.println(mode(n));
}
}