Ruby-不使用额外空间的转置矩阵-不更改我的原始数组

时间:2019-04-30 05:55:18

标签: ruby-on-rails ruby matrix transpose

我正在尝试解决一个难题:转置一个嵌套数组,而无需使用预定义的transpose方法或使用任何“额外空间”(例如临时变量)。

输入:[[1,2,3], [7,6,5], [8,2,1]]
输出:[[1,7,8],[2,6,2],[3,5,1]]

这是算法:  我们只需要交换索引。 例如:

  (0,0) -> (0,0)
  (0,1) -> (1,0) and (1,0) -> (0,1)
  (0,2) -> (2,0) and (2,0) -> (0,2)

然后继续。

下面是我的代码

arr = [[1,2,3], [7,6,5], [8,2,1]]

arr.each_with_index do |inner, i|
  inner.each_with_index do |e, j|
    arr[i][j], arr[j][i] = arr[j][i], arr[i][j]
  end
end

arr
#=> [[1, 2, 3], [7, 6, 5], [8, 2, 1]]

1 个答案:

答案 0 :(得分:1)

您可以通过加减法交换两个数字:

a = 2
b = 10

a = a + b #=> 12
b = a - b #=> 2
a = a - b #=> 10

a #=> 10
b #=> 2

使用此算法,我们可以仅使用现有的数组元素转置嵌套数组:

arr = [
  [1, 2, 3],
  [7, 6, 5],
  [8, 2, 1]
]

(0...arr.size).each do |i|
  (i+1...arr.size).each do |j|
    arr[j][i] = arr[j][i] + arr[i][j]
    arr[i][j] = arr[j][i] - arr[i][j]
    arr[j][i] = arr[j][i] - arr[i][j]
  end
end

arr
#=> [
#     [1, 7, 8],
#     [2, 6, 2],
#     [3, 5, 1]
#   ]