按差异分组列表元素

时间:2018-10-05 02:03:18

标签: algorithm list grouping

假设我有一个列表,

(1,2,4,6,7,8,10,23,34,35,67,69,70)

如何将列表中差异小于等于1的元素分组在一起,所以输出看起来像这样,

((1,2),(4),(6,7,8),(10),(23),(34,35),(67),(69,70))

我尝试提出一些迭代解决方案,但每次都失败,因为如果我们仅在迭代过程中删除元素,则列表状态会更改。无论如何,我认为我真的很困,不能自己解决这个问题。任何帮助表示赞赏。

任何编程语言都适合该解决方案,我正在寻找的只是一个发展方向。我不想要完整的解决方案。只是一些不完整的伪代码可以帮助我更快地解决此问题,因为这只是我要尝试的很小一部分。只需一个算法名称就可以了。 :)

2 个答案:

答案 0 :(得分:1)

Java不是Ruby,但希望它翻译起来很容易:

int[] arr = {1,2,4,6,7,8,10,23,34,35,67,69,70};

for(int i=1, j=0; i<=arr.length; i++)
{
  if(i == arr.length || arr[i]-1 != arr[i-1])
  {
    System.out.printf("%s ", Arrays.toString(Arrays.copyOfRange(arr, j, i)));
    j = i;
  }
}

输出:

[1, 2] [4] [6, 7, 8] [10] [23] [34, 35] [67] [69, 70] 

答案 1 :(得分:0)

好的,我想我解决了。但是对我来说仍然是丑陋的。我用了Ruby,

array = [1,2,4,6,7,8,10,23,34,35,67,69,70]

last_index_before = array.size - 1
arr = []

# Can not use map because of the break maybe?
(0..last_index_before).each do |_|
  element = array.delete_at(0)
  break if element.nil? # We reached the end
  results = [element]

  next_element = array[0]
  while !next_element.nil? && (next_element - element) <= 1
    results << array.delete_at(0)
    element = next_element
    next_element = array[0]
  end
  arr << results
end

p arr

输出

[[1, 2], [4], [6, 7, 8], [10], [23], [34, 35], [67], [69, 70]]