ruby - 数字范围相减算法

标签 ruby algorithm

我将如何完成以下任务:获取一个范围数组并从中减去另一个范围数组。

例如:

arr0 = [[0,50],[60,80],[100,150]] # 0-50, 60-80, etc.

arr1 = [[4,8],[15,20]] # 4-8, 15-20, etc.

# arr0 - arr1 magic

result = [[0,3],[9,14],[21,50],[60,80],[100,150]] # 0-3, 9-14, etc.

在 Ruby 中执行此操作最简洁、最有效的方法是什么?

最佳答案

这是一个故意幼稚的解决方案。它效率不高,但很容易理解并且很短。

arr0 解构为数字列表:

n1 = arr0.flat_map { |a, b| (a..b).to_a }
#=> [0, 1, ..., 49, 50, 60, 61, ..., 79, 80, 100, 101, ..., 149, 150]

arr1相同:

n2 = arr1.flat_map { |a, b| (a..b).to_a }
#=> [4, 5, 6, 7, 8, 15, 16, 17, 18, 19, 20]

然后,从 n1 中减去 n2 并重新组合连续的数字:

(n1 - n2).chunk_while { |a, b| a.succ == b }.map(&:minmax)
#=> [[0, 3], [9, 14], [21, 50], [60, 80], [100, 150]]

关于ruby - 数字范围相减算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41126506/

相关文章:

ruby - 是否可以在 Sinatra 中重写基本 URL?

ruby - 在 rails 中安装 mimemagic 时出错

algorithm - 查找数组中元素 >= k 的最大连续范围的次线性算法

algorithm - Dijkstra 算法和 Prim 算法什么时候会产生不同的输出?

ruby-on-rails - Chrome 渲染页面两次,而 Safari 按预期工作

ruby-on-rails - Ruby On Rails TCPSocket

ruby - 如何在 watir 中定位特定图像?

algorithm - 我应该如何为中国 postman 问题生成分区/对?

java - 在 Java 中修剪二维数组的有效方法

algorithm - 平均角度......再次