Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby-转置矩阵而不使用额外的空间-不改变我的原始数组_Ruby On Rails_Ruby_Matrix_Transpose - Fatal编程技术网

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

Ruby on rails Ruby-转置矩阵而不使用额外的空间-不改变我的原始数组,ruby-on-rails,ruby,matrix,transpose,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) 事情还在继续 下

我试图解决一个难题:在不使用预定义的
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]]

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

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

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

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

我找不到“额外空间”这个词。是否要在不使用空格的情况下以字符串格式打印数组?这是不可能的。在Ruby中所做的一切都将通过方法调用来完成。每个方法调用分配一个堆栈帧。因此,在Ruby中不使用任何额外的空间是不可能做任何事情的。所谓额外的空间,我的意思是不初始化另一个数组或使用任何临时变量。迭代器很好。“不初始化另一个数组”-但在代码中,您只需这样做:
arr[i][j],arr[j][i]=arr[j][i],arr[i][j]
为并行赋值创建一个新数组。“[不]使用任何临时变量”-因此,如果我使用
foo.bar.baz
,这是允许的,因为它不使用临时变量,但如果我使用
temp=foo.bar;temp.baz
这是不允许的,因为它使用一个临时变量,即使两个代码段具有完全相同的语义,使用完全相同的空间量,甚至(对于任何编译器)编译为完全相同的代码?这太荒谬了。你可以使用[[1,2,3],[7,6,5],[8,2,1]]。transposeI无法获得术语“额外空间”。是否要在不使用空格的情况下以字符串格式打印数组?这是不可能的。在Ruby中所做的一切都将通过方法调用来完成。每个方法调用分配一个堆栈帧。因此,在Ruby中不使用任何额外的空间是不可能做任何事情的。所谓额外的空间,我的意思是不初始化另一个数组或使用任何临时变量。迭代器很好。“不初始化另一个数组”-但在代码中,您只需这样做:
arr[i][j],arr[j][i]=arr[j][i],arr[i][j]
为并行赋值创建一个新数组。“[不]使用任何临时变量”-因此,如果我使用
foo.bar.baz
,这是允许的,因为它不使用临时变量,但如果我使用
temp=foo.bar;temp.baz
这是不允许的,因为它使用一个临时变量,即使两个代码段具有完全相同的语义,使用完全相同的空间量,甚至(对于任何编译器)编译为完全相同的代码?那太荒谬了。你可以用[[1,2,3],[7,6,5],[8,2,1]]转置