我有一个数组scores[5][5]
,并且里面有测试分数。
我需要找到最常出现的分数并将其归还。
答案 0 :(得分:2)
我只想创建一个HashMap<Integer,Integer>
,其中第一个整数是得分数组中的值,第二个是频率。
然后处理散列映射中的数组填充。如果密钥已存在,则将计数加1。如果是新密钥,请将其设置为1。
然后处理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
这是我将遵循的基本算法,它包含两个顺序循环。
第一个只是创建一个值到计数的映射,以便您以后可以找到最大的计数。
第二个遍历地图并创建一个具有最高计数值的列表。
答案 1 :(得分:1)
嗯,有两个部分:迭代分数并存储每个分数的频率。它们都涉及使用数组/ arraylist。如果您需要更多帮助,我们可以提出问题。 :d
答案 2 :(得分:0)
由于分数可能在有界范围内(例如0..100
),因此您可以使用计数数组快速完成此操作。基本上,您正在进行counting sort的第一阶段。
所有可能分数的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]);
答案 3 :(得分:0)
或者随时指向当前最大的指针。每次创建或更新时,请比较以查看是否刚刚超过之前的最大值并替换它(如果有)。 保存另一个遍历hashmap的传递。
答案 4 :(得分:0)
对于这样的事情,编写代码来模拟你在现实生活中的表现。
我们的模特:
你的[5] [5]数组:它只是一个包含5列5行的数字网格。
从0,0位置开始 - 读取该位置的值,并启动一个列表(在Java中,在ArrayList或HashMap中),将该数字添加到列表中并给它一个井号(值为1),表明你已经看过一次了。
穿过行,然后向左和向后行,等等。
您阅读的每个号码,请检查它是否已列在您的列表中。如果是,只需再创建一个哈希标记(加1)。如果没有,那么将数字添加到列表中并给它一个井号。
读完数组后,从头开始查看列表,并通过将手指放在上面跟踪您看到的最多哈希标记的数字(将数字存储在变量中)。 / p>
返回最后一个变量。