假设我有一个列表,
(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))
我尝试提出一些迭代解决方案,但每次都失败,因为如果我们仅在迭代过程中删除元素,则列表状态会更改。无论如何,我认为我真的很困,不能自己解决这个问题。任何帮助表示赞赏。
任何编程语言都适合该解决方案,我正在寻找的只是一个发展方向。我不想要完整的解决方案。只是一些不完整的伪代码可以帮助我更快地解决此问题,因为这只是我要尝试的很小一部分。只需一个算法名称就可以了。 :)
答案 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]]