2016-08-29 54 views
1

我想弄清楚如何找到一個整數數組中最頻繁元素的計數。我可以想到一些可能有用的方法,但是當我在塊內寫入表達式時,我完全喪失瞭如何將元素與下一個元素和上一個元素進行比較。有任何想法嗎?所有的幫助真的很感謝!紅寶石陣列最頻繁元素的數量

+0

這個問題是重複的,這並不奇怪。然而,不清楚哪個問題是重複的。我讀到的問題是最大數量將被返回(「...如何找到數組中最頻繁元素的數量...」)。 (請參閱@Tadman對我的回答的評論。)「這個問題在這裏已經有了答案:」要求計數最大的元素。當然,從獲得最大計數的問題的答案來看,這是一個非常短的步驟,但如果只需要最大計數,可能會有更好的方法。 –

回答

4

一個簡單的方法是確定所有的唯一值,將每個值轉換爲它在數組中的數量,然後確定最大的計數。

def max_count(arr) 
    arr.uniq.map { |n| arr.count(n) }.max 
end 

例如:

arr = [1,2,4,3,2,6,3,4,2] 
max_count(arr) 
    #=> 3 

有三個步驟:

a = arr.uniq 
    #=> [1, 2, 4, 3, 6] 
b = a.map { |n| arr.count(n) } 
    #=> [1, 3, 2, 2, 1] 
b.max 
    #=> 3 

稍微更有效的方式(因爲arr元素列舉僅一次)是使用計數hash:

def max_count(arr) 
    arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }.values.max 
end 

max_count(arr) 
    #=> 3 

我們:

a = arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 } 
    #=> {1=>1, 2=>3, 4=>2, 3=>2, 6=>1} 
b = a.values 
    #=> [1, 3, 2, 2, 1] 
b.max 
    #=> 3 

Hash.new(0)的說明,請參見Hash::new。簡而言之,如果h = Hash.new(0)h沒有密鑰k,則h[k]將返回默認值,這裏是零。 h[k] += 1擴大爲h[k] = h[k] + 1,所以如果h沒有密鑰k,則這將變成h[k] = 0 + 1。另一方面,如果說,h[k] => 2,然後h[k] = h[k] + 1 #=> h[k] = 3 + 1

+0

不要忘記['max_by'](http://ruby-doc.org/core-2.3.1/Enumerable.html#method-i-max_by)。 – tadman

+0

@tadman,我認爲'max_by',但它是最大數量,而不是最大數量的元素,這是需要的。如果我使用了'max_by',我需要重新計算那個元素的計數,這沒有吸引力。 –

+0

這是對問題的一種解釋,這是真的。我讀它是想要基於* count的最頻繁元素*的另一種方式。 – tadman