我正在解决一些练习问题,以提高我的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]
]
有人可以向我解释我做错了吗?
答案 0 :(得分:3)
我使用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]]
答案 1 :(得分:2)
解决方案中的主要问题是您更改迭代的数组。想想[2x2]
矩阵:
[
[1, 2],
[3, 4]
]
现在,您迭代第一个索引(0,0),并为其指定位置(1,0),现在您的矩阵是:
[
[3, 2],
[3, 4]
]
现在,无论你的其余算法是什么,你都会在位置(0,0)丢失1
!
你可能在算法中有更多的错误 - 但这是你的show-stopper - 你应该创建一个新的数组,而不是覆盖现有的数组。
答案 2 :(得分:1)
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]]