【发布时间】:2017-10-30 17:31:41
【问题描述】:
我的目的是从list 填充一个数组:
list = [-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 12, 13, 15]
按以下顺序:
- 不跟随其递增值(1)的单个整数将直接添加到结果数组中。
- 后跟其递增值(1)的整数将被添加到范围数组中,然后该数组将添加到结果中,并将再次重置以用于下一个范围。
正确的输出应该是:
solution(list)
# => [-6, [-3, -2, -1, 0, 1], [3, 4, 5], [7, 8, 9, 10], [12, 13], 15]
我的代码和我的输出如下。
def solution(list)
result = []
idx = 0
loop do
range = []
loop do
if list[idx+1] - list[idx] == 1
range << list[idx]
idx += 1
else
result << list[idx]
idx += 1
break
end
end
result << range
break if idx == list.size - 1
end
result
end
solution(list)
# => [-6, [], 1, [-3, -2, -1, 0], 5, [3, 4], 10, [7, 8, 9], 13, [12]]
代码不正确。你能告诉我我错过了什么吗?
【问题讨论】:
-
您的代码完全损坏了...我不会费心单步调试它;我只是重写它。
-
另外,我知道这是一个算法挑战,但在“正常情况下”你可以使用 ruby 广泛表达的语言 - 例如
list.slice_when { |prev, curr| curr != prev.next }.to_a -
提示:尝试使用各种不同的输入来测试您的方法。尝试给它一个空数组,或者一个包含 1 个元素的数组,或者一个所有元素都是连续的数组,或者没有一个元素是连续的,...。使用涵盖更多边缘情况的各种输入来调试问题要容易得多。
-
这是我第一次实际遇到 slice_when 方法,它似乎非常适合这种排序。我试图以迭代的方式解决它,但没有奏效。感谢这个简短的方法。
-
我仍然强烈建议你尝试“手动”实现这个,如果这是练习的全部重点...... Ruby 丰富的库使编写简洁的代码变得非常容易,但我在感觉这是一个算法挑战。