数组在另一个数组中出现多少次?

时间:2018-11-15 11:53:44

标签: ruby-on-rails arrays ruby

我是Ruby on Rails的新手。这个问题似乎在其他编程语言中得到了回答,但RoR却没有。

我有一个数组,其中包含3个项目。

array1 = [1, 2, 3]

然后我要检查另一个数组中的项,以查看array1array2中出现了多少次:

array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 10, 11, 2, 12, 3]

答案应为2。

3 个答案:

答案 0 :(得分:6)

您可以尝试以下操作:

a1.map { |a1i| a2.count(a1i) }.min

计算array1中每个项目出现在array2中的频率,然后获取最小计数作为可能的无交集子数组的数量。

我对@Stefan的建议的看法的粗略表述:

a1.product([0]).to_h.merge(
  a2.group_by(&:itself).transform_values(&:size)
).values_at(*a1).min

还有一个更合理的选择:

count_per_a2i = a2.group_by(&:itself).transform_values(&:size)
a1.map { |a1i| count_per_a2i[a1i] }.min_by(&:to_i)

答案 1 :(得分:1)

另一种方法:

array2.each_with_object(array1.product([0]).to_h) do |el, hash|
  hash[el] += 1 if hash.key?(el)
end.each_value.min

一次遍历array2,计算我们感兴趣的元素,选择最小值。

已使用

array1.product([0]).to_h
 => {1=>0, 2=>0, 3=>0}

播种起始计数器。

答案 2 :(得分:1)

就像其中一篇文章的评论中提到的@stefan一样。

  

您还可以构建频率哈希表,以避免多次遍历数组。

这意味着:

frequency_map = Hash.new{|h,k| h[k] = 0 }

array2.each{ |number| frequency_map[number] += 1 }

frequency_map
#=> {1=>2, 2=>2, 3=>2, 4=>1, 5=>1, 6=>1, 7=>1, 8=>1, 9=>1, 10=>1, 11=>1, 12=>1}

正如您在上面看到的,我们只有一次迭代获得array2中每个数字的频率,即O(n)时间,但是具有O(n)空间复杂度。

根据上述频率,我们可以轻松推断出array1array2中出现的次数:

frequency_of_array1 = nil
array1.each do |number|
  if frequency_of_array1.nil?
    frequency_of_array1 = frequency_map[number]
  else
    frequency_of_array1 = frequency_of_array1 > frequency_map[number] ? frequency_map[number] : frequency_of_array1
  end
end

frequency_of_array1 #=> 2

或者简单地说(但是建立另一个数组/空间-上面避免了):

array1.map{ |num| frequency_map[num] }.min