一尘不染

如何将整数数组汇总为范围数组?

algorithm

我想输入以下内容:

[1,2,4,5,6,7,9,13]

并将其转换为以下内容:

[[1,2],[4,7],[9,9],[13,13]]

每个子数组代表一个整数范围。


阅读 300

收藏
2020-07-28

共1个答案

一尘不染

使用Enumerable#chunk的功能方法:

ranges = [1, 2, 4, 5, 6, 7, 9, 13]
  .enum_for(:chunk) # .chunk for Ruby >= 2.4
  .with_index { |x, idx| x - idx }
  .map { |_diff, group| [group.first, group.last] }

#=> [[1, 2], [4, 7], [9, 9], [13, 13]]

工作原理:一旦建立索引,数组中的连续元素就具有相同的x - idx,因此我们使用该值对输入数组进行分块(连续项的分组)。最后,我们只需要采用每个组的第一个和最后一个元素来构建对。

2020-07-28