确定数组中最常见的事件

Sha*_*n00 10 java algorithm

假设我有一系列双打,如下所示:

Array[10] = {10, 10, 10, 3, 10, 10, 6, 10, 10, 9, 10}
Run Code Online (Sandbox Code Playgroud)

我需要一个函数来确定数组中MAJORTY投票的内容,在本例中为"10",因为它是最常出现的数字......当然还有没有多数投票的情况(它们在哪里)等于),在这种情况下,我需要抛出异常......

有线索吗?除了在数组上做一些非常讨厌的循环之外(对于每个索引,确定存在多少具有相同值的数量,在数组中存储计数,然后扫描计数数组中的最高数字,并且该位置的值是赢家等...)

dfa*_*dfa 17

使用a Map<Integer, Integer>应该简单如下:

int mostFrequent(int... ary) {
    Map<Integer, Integer> m = new HashMap<Integer, Integer>();

    for (int a : ary) {
        Integer freq = m.get(a);
        m.put(a, (freq == null) ? 1 : freq + 1);
    }

    int max = -1;
    int mostFrequent = -1;

    for (Map.Entry<Integer, Integer> e : m.entrySet()) {
        if (e.getValue() > max) {
            mostFrequent = e.getKey();
            max = e.getValue();
        }
    }

    return mostFrequent;
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*rdt 5

你的第一个问题是你有一个"双打数组",因为浮点数据的相等性是有问题的(相同的数值可以用不同的位模式来表示).如果您的双打事实上(如示例中)整数,请int改用.除此之外,请仔细考虑如何定义哪些值相等以表示相同的投票.

至于确定多数投票,使用a Map以"投票ID"作为关键字并将投票数作为值 - 然后在最后通过地图迭代以找到最大值.

  • 如果所有值都是整数,那么double将非常有效.您也不应该关注位模式,如果值在数值上相等(=仅限NaN),==将返回true.双重问题(如果有的话)是否应该认为非常接近的值应该是平等的.答案取决于值的来源(例如,它们是否来自某些物理测量过程). (2认同)