You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中如何获取两数组元素最少出现次数的交集(含重复)

Ruby数组取元素出现次数最小值的交集集合

给定两个数组:

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

我们需要得到元素集合[1, 2, 2]——保留每个元素在两个数组中出现次数的最小值对应的元素,而Ruby内置的&运算符只能返回去重后的交集,无法满足重复元素的需求:

a & b # => [1, 2]

解法思路

通过统计元素出现次数,取每个共同元素的最小出现次数,再将元素按该次数展开为数组:

  1. 用哈希统计两个数组中各元素的出现次数
  2. 对共同元素,取两个数组中出现次数的最小值
  3. 将元素按最小次数重复,拼接成最终结果数组

实现代码

写法一:分步统计与计算

# 统计数组a的元素出现次数
count_a = a.each_with_object(Hash.new(0)) { |num, hash| hash[num] += 1 }
# 统计数组b的元素出现次数
count_b = b.each_with_object(Hash.new(0)) { |num, hash| hash[num] += 1 }

# 筛选共同元素,按最小次数生成结果
result = count_a.keys.intersection(count_b.keys).flat_map do |key|
  [key] * [count_a[key], count_b[key]].min
end

p result # => [1, 2, 2]

写法二:合并哈希简化代码

# 合并两个数组的计数哈希,取每个元素的最小出现次数
min_counts = a.each_with_object(Hash.new(0)) { |n, h| h[n] += 1 }
             .merge(b.each_with_object(Hash.new(0)) { |n, h| h[n] += 1 }) { |k, v1, v2| [v1, v2].min }

# 将哈希展开为结果数组
result = min_counts.flat_map { |key, times| [key] * times }

p result # => [1, 2, 2]

说明

  • Hash.new(0)确保未出现的元素默认计数为0,避免键不存在的错误
  • flat_map用于将重复的元素数组直接展开,无需额外拼接
  • 该解法自然支持空数组、无共同元素等边界情况,此时结果为空数组

内容的提问来源于stack exchange,提问作者Said Dumuzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:00:31