我如何使用Ruby旋转这个二维数组



我正在通过一些实践问题来提高我的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]]

最新更新