减去数字范围算法

时间:2016-12-13 16:54:30

标签: ruby algorithm

如何完成以下操作:取一个范围数组并从中减去另一个范围数组。

例如:

%%d

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

1 个答案:

答案 0 :(得分:3)

这是一种刻意天真的解决方案。它效率不高,但很容易理解而且很短。

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]

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

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