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

时间:2014-03-24 19:32:02

标签: 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]
]

有人可以向我解释我做错了吗?

3 个答案:

答案 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]]