2010-04-30 45 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)即可。如果沒有,然後將該號碼添加到您的列表並給它一個哈希標記。

讀完數組後,從頭開始查看列表,並通過將手指放在數字上(將數字存儲在變量中)來跟蹤您看到的散列標記最多的數字。

返回最後一個變量。