Ruby - Транспонировать матрицу, не используя лишний пробел - Не изменяя мой исходный массив - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь решить задачу: транспонировать вложенный массив без использования заранее определенного метода 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 Ответ

1 голос
/ 30 апреля 2019

Вы можете поменять местами два числа путем сложения и вычитания:

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]
#   ]
...