Как получить число, которое повторяется в массиве наименьшее количество раз? - PullRequest
1 голос
/ 01 апреля 2011

Как получить номер, который повторяется наименьшее количество раз?

Например:

  • из [1,2,3,4,5,6,6,2,3,4,6] return [1], потому что «1» повторяется только один раз, в то время как другие повторяются 2 или более раз.
  • из [1,1,1,2,3,3,4,4,5,6,6,2,3,4] return [2,6], потому что "2" и "6" только повторяется дважды вместо трех или более раз для других чисел.

Ответы [ 3 ]

3 голосов
/ 01 апреля 2011

Это должно работать:

a.group_by{|e| a.count(e)}.min[1].uniq

ruby-1.9.2-p136 :040 > a =  [1,1,1,2,3,3,4,4,6,6,2,3,4]
ruby-1.9.2-p136 :041 > a.group_by{|e| a.count(e)}.min[1].uniq
 => [2, 6] 

ruby-1.9.2-p136 :044 > a =   [1,2,3,4,6,6,2,3,4,6]
ruby-1.9.2-p136 :045 > a.group_by{|e| a.count(e)}.min[1].uniq
 => [1]

Обновление: O (n) время

def least_frequent(a)
  counts = Hash.new(0)
  a.each{|e| counts[e] += 1}
  least =[nil, []]
  counts.each do |k,v|
    if least[0].nil?
      least[0] = v
      least[1] = k
    elsif v < least[0]
      least[0] = v
      least[1] = [k]
    elsif v == least[0]
      least[1] << k
    end
  end
  least[1]
end

Вот тесты (это работаетпроверить 10000 раз) между первым и вторым методом:

             user     system      total        real
first   10.950000   0.020000  10.970000 ( 10.973345)
better   0.510000   0.000000   0.510000 (  0.511417)

с массивом, установленным в:

a =  [1,1,1,2,3,3,4,4,6,6,2,3,4] * 10
3 голосов
/ 01 апреля 2011

Вы можете сделать:

a = [1,1,1,2,3,3,4,4,5,6,6,2,3,4]
a.group_by{|i| a.count(i) }
#=> {1=>[5], 2=>[2, 2, 6, 6], 3=>[1, 1, 1, 3, 3, 3, 4, 4, 4]}

А затем выберите из этого хэша то, что вы хотите (ключ хэша - это число элементов)

1 голос
/ 01 апреля 2011
>> h = [1,1,1,2,3,3,4,4,5,6,6,2,3,4].inject(Hash.new(0)) { |x,y| x[y]+=1;x }.select{|x,y| y>1 }
=> {1=>3, 2=>2, 3=>3, 4=>3, 6=>2}
>> h.values.min
=> 2
>> h.each{|x,y| puts "#{x} #{y}" if y==h.values.min }
2 2
6 2
=> {1=>3, 2=>2, 3=>3, 4=>3, 6=>2}
>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...