我有一个数组,scores[5][5]
里面装满了考试成绩。
我需要找到最常出现的分数并将其返回。
我会简单地创建一个HashMap<Integer,Integer>
,其中第一个整数是分数数组中的值,第二个是频率。
然后处理填充hashmap的数组。如果密钥已经存在,则将计数加一。如果是新密钥,请将其设置为一个。
然后处理 hashmap 以找到出现次数最多的值。
一旦我可以访问安装了 Java 的机器,我就打算处理源代码,但是,由于它现在被标记为作业,它只是算法(从长远来看,这对你来说会更好):
Create empty hashmap freq
For each entry in your array (probably nested loops):
If entry.value is not in freq:
Add entry.value to freq, set its count to zero
Increase count of freq.value
Set max_count to 0
For each item in freq:
If item.count is greater than max_count:
Set max_list to an empty list
Set max_count to item.count
If item.count is equal to max_count:
Append item.value to max_list
If max_count is greater than 0:
Output max_count, max_list
这是我要遵循的基本算法,它由两个顺序循环组成。
第一个简单地创建值到计数的映射,以便您以后可以找到最大的计数。
第二个遍历地图并创建具有最高计数的值列表。
嗯,有两个部分:迭代分数和存储每个分数的频率。它们都涉及使用数组/数组列表。如果您需要更多帮助,我们可以直接提问。:D
对于这样的事情,编写代码来模拟你在现实生活中的做事方式。
让我们建模:
您的 [5][5] 数组:它只是一个 5 列 5 行的数字网格。
从 0,0 位置开始 - 读取该位置的值,并开始一个列表(在 Java 中,一个 ArrayList 或 HashMap),将数字添加到列表中并给它一个哈希标记(值为 1),以指示您见过一次。
穿过这一行,然后向左和向下一排,等。
您阅读的每个数字,检查它是否已经在您的列表中。如果是,只需制作另一个井号(加 1)。如果没有,则将数字添加到您的列表中并给它一个井号。
读完数组后,从头开始查看列表,并通过将手指放在其上(将数字存储在变量中)来跟踪您所见过的哈希标记最多的数字。
返回最后一个变量。
由于分数可能在有界范围内(例如0..100
),因此您可以使用计数数组快速完成此操作。基本上,您正在进行计数排序的第一阶段。
对于count
所有可能的分数,从 开始0
,然后对于每个分数s
,递增count[s]
。处理完所有分数后,扫描count
并查看哪个分数count[k]
最高。
您还可以在计数时跟踪最常见的分数。只需执行以下操作:
// init
mostFrequent = 0;
// during increment
count[s]++;
if (count[s] > count[mostFrequent]) {
mostFrequent = s;
}
由于您的分数排列在二维矩阵中(出于某种原因?),您可以按如下方式处理每个分数:
int[] count = new int[RANGE]; // valid scores are 0..RANGE-1
mostFrequent = 0;
for (int[] tuplet : scores) {
for (int s : tuplet) {
count[s]++;
if (count[s] > count[mostFrequent]) {
mostFrequent = s;
}
}
}
report(mostFrequent, count[mostFrequent]);
或者在你去的时候保持一个指向当前最大的指针。每次创建或更新时,比较一下是否刚刚超过了之前的最大值,如果有则替换它。通过哈希图保存另一个通道。