Ruby中如何获取两数组元素最少出现次数的交集(含重复)
Ruby数组取元素出现次数最小值的交集集合
给定两个数组:
a = [1, 2, 2, 1] b = [1, 2, 2, 3]
我们需要得到元素集合[1, 2, 2]——保留每个元素在两个数组中出现次数的最小值对应的元素,而Ruby内置的&运算符只能返回去重后的交集,无法满足重复元素的需求:
a & b # => [1, 2]
解法思路
通过统计元素出现次数,取每个共同元素的最小出现次数,再将元素按该次数展开为数组:
- 用哈希统计两个数组中各元素的出现次数
- 对共同元素,取两个数组中出现次数的最小值
- 将元素按最小次数重复,拼接成最终结果数组
实现代码
写法一:分步统计与计算
# 统计数组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
相关产品推荐
相关产品推荐

