2010-04-30 78 views
0

我有一个数组,scores[5][5]它充满了测试分数。计算一个数组中的数字的频率

我需要找到最频繁出现的分数并将其返回。

+0

你是这个达尔顿吗? http://stackoverflow.com/users/307394/dalton – trashgod 2010-04-30 00:50:38

+0

这个问题有关吗? http://stackoverflow.com/questions/2740852/finding-the-best-person-in-an-array – trashgod 2010-04-30 00:50:58

+0

是为什么它由于某种原因 – dalton 2010-04-30 00:52:36

回答

1

好吧,有2个部分:迭代分数并存储每个分数的频率。它们都涉及使用数组/列表列表。如果您需要更多帮助,我们可以提出问题。 :D

+0

什么是迭代分数以及如何使用数组/数组列表 – dalton 2010-04-30 00:54:38

+2

检查[this](http://java.sun.com/docs/books/tutorial/java/nutsandbolts/arrays.html)和[this](http ://java.sun.com/docs/books/tutorial/collections/index.html)。 – BalusC 2010-04-30 01:00:06

2

我会简单地创建一个HashMap<Integer,Integer>其中第一个整数是分数数组中的值,第二个是频率。

然后在hashmap中处理数组填充。如果一个密钥已经存在,请将计数加1。如果它是新密钥,请将其设置为1。

然后处理散列图以查找出现次数最多的值。


我要对源代码的工作,一旦我进入到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 

这是我将遵循的基本算法,它由两个顺序循环组成。

第一个只是创建一个值到计数的映射,以便您可以稍后查找最大计数。

第二个遍历地图并创建具有最高计数值的列表。

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]); 
+0

由于这是比算法更多的代码,我不得不说道尔顿没有理由不能获得相当好的成绩。也是可惜的,因为它是解决iter问题的最简单的问题。 – jcolebrand 2010-04-30 03:28:48

0

或者保持一个指针当前最大的一个。每次创建或更新时,都要比较一下,看看你是否刚刚超过了以前的最大值,如果有,就更换它。 保存另一个通过散列映射。

0

对于这样的事情,编写代码来模拟在现实生活中你将如何做事。

让我们的模型:

你的[5] [5]数组:这只是一个5列和5行数的网格。

从0,0位置开始 - 读取该位置的值,并启动一个列表(在Java中,一个ArrayList或HashMap),将该数字添加到列表中并给它一个哈希标记(值为1) ,以表明你已经看过一次。

穿过该行,然后左后下行,等等。

你读的每个数字,检查它是否已经在你的列表中。如果是,只需制作另一个散列标记(加1)即可。如果没有,然后将该号码添加到您的列表并给它一个哈希标记。

读完数组后,从头开始查看列表,并通过将手指放在数字上(将数字存储在变量中)来跟踪您看到的散列标记最多的数字。

返回最后一个变量。