该方法的基本前提是参数数组采用多维数组并绕矩阵顺时针方向将所有值推入arr并将它们作为整数列表返回。
但是,我似乎收到了这个错误:
`block in snail': undefined method `reverse' for nil:NilClass (NoMethodError)
这是我的方法:
def snail(array)
arr = []
loop do
return arr.flatten if array.empty?
arr << array.shift
array.map {|row| arr << row.pop}
arr << array.pop.reverse
array.map {|row| arr << row.shift}
end
end
这是测试论点:
[[1,2,3],[4,5,6],[7,8,9]
这是我在编辑第5行时得到的输出:
line 5: arr << unless NilClass then array.pop.reverse end
output: [1, 2, 3, 6, 9, nil, 4, 7, 5, 8, nil, nil]
预期回报:
[1, 2, 3, 6, 9, 8, 7, 4, 5]
为什么会出现这些零值?
答案 0 :(得分:1)
问题在于,在第二次迭代中,arr << array.shift
在array.pop
之后变为空,因此接下来的两行在空数组上执行。您看到的错误是因为方法第八行的nil
没有任何内容,因此返回nil
而#reverse
不支持array
。
您需要处理def snail(array)
arr = []
until array.flatten.empty?
arr << array.shift
array.map {|row| arr << row.pop} unless array.flatten.empty?
arr << array.pop.reverse unless array.flatten.empty?
array.map {|row| arr << row.shift} unless array.flatten.empty?
end
return arr.flatten
end
在任何阶段都可能耗尽,而不仅仅是在执行了所有四个操作之后。{/ p>
array.reverse.map {|row| arr << row.shift} unless array.flatten.empty?
顺便说一下......我认为左侧的蜗牛没有正确编码。你必须从下到上读取数字,所以,循环的最后一行应该是......
{{1}}
问题没有显示在您的测试参数上,但如果您尝试使用更大的矩阵,则会看到问题,例如
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
你的方法给出...... [1,2,3,4,8,12,16,15,14,13,5,9,6,7,11,10]
但正确答案是...... [1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]