我正在尝试解决一个难题:转置一个嵌套数组,而无需使用预定义的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]]
答案 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]
# ]