查找数组中最常见元素的频率

时间:2014-04-30 23:38:42

标签: java

我有一个数组:

int[] anArray = new int[6];

如果数组包含1,4,5,4,4怎么办?我怎样才能获得最多的比赛?在这种情况下,4是最常见的数字,并且有三个,因此该函数应返回3

如果我有1,2,1,2,3,则应返回2。 或者,如果我有4,0,1,2,3,则应返回1

我真的无法理解。我试过这个:

public static int getCorrectMatches(int[] flowers) throws Exception {
    int highest = 0;
    for(int index = 0; index < 5; index++) {
        int count = countMatches(flowers, index);
        if(count > highest) {
            highest = index;
        }
    }
    return highest;
}

public static int countMatches(int[] array, int match) throws Exception {
    int count = 0;
    for(; count < array.length && array[count] == match; count++);
    return count;
}

哪个不起作用。我很感激任何帮助。

4 个答案:

答案 0 :(得分:3)

迭代数组并为每个数字存储一个哈希映射中的计数器,其中地图的键是数字,值是跟踪出现次数的计数器。第一次遇到新号码(没有键)时,您需要插入一个新的计数器。下次遇到相同的号码时,您只需使用新号码更新现有的计数器。

保持正在运行的“大多数匹配”号码并且每次更新计数器时都要更新它也不会太难。

答案 1 :(得分:0)

for each index in array
HashMap.put(number on index i, occurrences) +=1
check biggest value in the hash map

http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#put(K,%20V)

答案 2 :(得分:0)

public static int numberOfMatches(int[] numbers) {
    int mostMatches = 0;

    for(int i = 0; i < numbers.length; i++) {
        int matches = 0;
        int holder = numbers[i];

        for(int number : numbers) {
            if(number == holder) {
                matches++;
            }
        }

        if(matches > mostMatches)
            mostMatches = matches;
    }
    return mostMatches;
}

这接受一个数组。它检查数组的长度,并为每个插槽循环。 对于每个插槽,我创建了2个变量。 holder抓取广告位中的值,只要匹配就会增加matches

找到该插槽的所有可能匹配后,它会将找到的匹配数量与目前为止找到的最高匹配数量进行比较。

答案 3 :(得分:0)

您的countMatches()方法不正确。从循环变量中取消计数并检查循环内的相等性,而不是将其置于循环条件中。把它改成这样的东西:

public static int countMatches(int[] array, int match) throws Exception {
    int count = 0;

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

        if(array[i] == match) count++;
    }

    return count;
}

另外,如果我是你,我会改变

for(int index = 0; index < 5; index++) {

要,

for(int index = 0; index < flowers.length; index++) {