假设我有一份清单,
(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))
我试着想出一些迭代的解决方案,但每次都失败了,因为如果我们只是在迭代期间删除元素,则列表的状态会发生变化。无论如何,我想我真的被卡住了,我自己解决不了这个问题。任何帮助都是非常感谢的。
任何编程语言都可以解决这个问题,我所寻找的只是一个方向。我不想要完整的解决方案。只是一些不完整的伪代码,可以帮助我更快地解决这个问题,因为这只是我正在尝试做的非常小的一部分。只需要一个算法的名称就可以了。:)
发布于 2018-10-05 02:44:52
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]
发布于 2018-10-05 02:32:38
好了,我想我已经解决了。但在我看来还是很丑陋。我用的是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]]
https://stackoverflow.com/questions/52657366
复制