2017-10-30 7 views
1

가있는 경우, 배열의 대부분의 발생과 항목을 찾을 수 :루비 : 내가 배열에서 항목 대부분의 항목을 찾을 수 있습니다이 코드

letters.max_by { |i| letters.count(i) } 

그러나이

a = [1, 2, 2, 3, 3] 

에 대한 2를 반환합니다 3에도 같은 결과가 나타납니다. 이 실제로 인 항목이있는 경우 어떻게 알 수 있습니까? 하나의 챔피언이 없다면 false을 얻고 싶습니다.

+0

는 "정말"당신은 아마 마음이 무엇인지에 대한 올바른 단어가 아닙니다. – sawa

+1

[Ruby : 가장 많이 출현 한 배열의 항목을 찾는 방법] (https://stackoverflow.com/questions/412169/ruby-how-to-find-item-in-array-which-has) 가장 많이 발생하는 것) – Technophobe01

답변

1

난 당신이 성능에 대해 걱정하지 않는 경우에 당신이 할 수있는 것 같아요 :

def max_occurrences(arr) arr.sort.max_by{|v| arr.count(v)} != arr.sort.reverse.max_by{|v| arr.count(v)} ? false : arr.max_by{|v| arr.count(v)} end

+0

나는 그것의 작은 도구를 신경 쓰지 않는다. 그래서 나를 위해 일한다. – Asara

3

이 꽤 추한 및 개선의 필요성에 있지만 :

def champion(array) 
    grouped = array.group_by(&:itself).values.group_by(&:length) 

    best = grouped[grouped.keys.max] 

    if (best.length == 1) 
    best[0][0] 
    else 
    false 
    end 
end 

나는 이것에 대한 쉬운 단발 솔루션 O (N^2가 아니라 하나가 적어도, 거기 확실하지 않다) 또는 그 이상입니다. 이는 특이합니다.

+0

나는 이것이 문제라는 것을 알고있다. 그러나 단지 "최선"을 되 찾는 것이 훨씬 더 관용적이다. 0, 1 또는 그 이상의 최대 값을 확인하는 것은 호출자의 몫입니다. – Max

+0

@max 그래, 나는 거기에 동의하지 않는다. 이 기능의 설계는 기대치가 다를 경우 크게 변경 될 수 있습니다. – tadman

0

나는 이런 식으로 뭔가 할 것 :

def max_occurrences(arr) 
    counts = Hash.new { |h, k| h[k] = 0 } 
    grouped_by_count = Hash.new { |h, k| h[k] = [] } 
    arr.each { |el| counts[el] += 1 } # O(n) 
    counts.each { |el, count| grouped_by_count[count] << el } # O(n) 
    max = grouped_by_count.sort { |x, y| y[0] <=> x[0] }.first[1] # O(n log n) 
    max.length == 1 ? max[0] : false 
end 

그것은 더 아주 세련 한 줄 없다, 그러나 그것은 (N 로그 n) O 이내에 읽을 수 있어요 및 실행됩니다.

0
a = [1, 2, 2, 3, 3] 
occurrences = a.inject(Hash.new(0)){ |h, el| h[el] += 1; h } # => {1=>1, 2=>2, 3=>2} 
max_occurences = occurrences.max_by{ |_, v| v } # => [2, 2] 
max_occurences.count > 1 ? false : occurrences.key(max_occurences.first)