我正在通过一些实践问题来提高我的Ruby技能,我正在解决我必须将二维数组旋转90度的问题。这是输入:
image = [
[1,2,3,4],
[5,6,7,8],
[9,0,1,2],
[3,4,5,6]
]
期望输出为:
image = [
[3,9,5,1],
[4,0,6,2],
[5,1,7,3],
[6,2,8,4]
]
这是我写的输出错误的代码:
def matrix(image)
y = image.length
for i in 0..y-1
for j in 0..y-1
image[i][j] = image[i][y-j-1]
end
end
image
end
这是该代码的输出:
image = [
[4, 3, 3, 4],
[8, 7, 7, 8],
[2, 1, 1, 2],
[6, 5, 5, 6]
]
谁能告诉我我做错了什么? 我会使用Array#transpose
:
image = [
[1,2,3,4],
[5,6,7,8],
[9,0,1,2],
[3,4,5,6]
]
image.transpose.map(&:reverse)
# => [[3, 9, 5, 1], [4, 0, 6, 2], [5, 1, 7, 3], [6, 2, 8, 4]]
解决方案中的主要问题是您更改了要迭代的数组。考虑一个[2x2]
矩阵:
[
[1, 2],
[3, 4]
]
现在,你迭代第一个索引(0,0),并分配它的位置在(1,0)现在你的矩阵是:
[
[3, 2],
[3, 4]
]
现在,不管你的算法的其余部分-你失去了位置(0,0)的1
!
你可能在算法中有更多的错误-但这是你的show-stopper -你应该创建一个新的数组,而不是覆盖现有的
image = [
[1,2,3,4],
[5,6,7,8],
[9,0,1,2],
[3,4,5,6]
]
y = image.length
new_arr = []
for i in 0..y-1
new_arr << image[i].dup
for j in 0..y-1
if y-j-1 == i || i > y-j-1
image[i][j] = new_arr[y-j-1][i]
else
image[i][j] = image[y-j-1][i]
end
end
end
#=> [[3, 9, 5, 1], [4, 0, 6, 2], [5, 1, 7, 3], [6, 2, 8, 4]]
不使用transpose
的另一个想法是使用map
来创建新的数组矩阵:
image = [
[1,2,3,4],
[5,6,7,8],
[9,0,1,2],
[3,4,5,6]
]
(0...image.length).map do |i|
(0...image.length).map do |j|
image[j][i]
end
end.map(&:reverse)
# => [[3, 9, 5, 1], [4, 0, 6, 2], [5, 1, 7, 3], [6, 2, 8, 4]]