0

在下面的代码中,我试图将矩阵转置 90 度。但是当我运行代码时,我得到一个参数错误:

我不明白为什么会发生这种情况,因为我在方法定义中显然有一个论点。对于为什么会发生此错误,我将不胜感激。谢谢。

irb(main):001:0> matrix1 = [
irb(main):002:1*   [1, 5, 8],
irb(main):003:1*   [4, 7, 2],
irb(main):004:1*   [3, 9, 6]
irb(main):005:1> ]
=> [[1, 5, 8], [4, 7, 2], [3, 9, 6]]
irb(main):006:0> def rotate90(matrix_input)
irb(main):007:1>   input_column = 0
irb(main):008:1>   input_row = 0
irb(main):009:1>   return_column = matrix_input.size - 1
irb(main):010:1>   matrix2 = []
irb(main):011:1>   mat1_size = matrix_input.size -1 
irb(main):012:1>   loop do
irb(main):013:2*     loop do
irb(main):014:3*       matrix2[input_column][return_column] = matrix_input[input_row][input_column]
irb(main):015:3>       input_column += 1
irb(main):016:3>       break if input_column >= matrix_input[0].size - 1
irb(main):017:3>     end
irb(main):018:2>     input_row += 1
irb(main):019:2>     input_column = 0
irb(main):020:2>     return_column -= 1
irb(main):021:2>     break if input_row >= mat1_size
irb(main):022:2>   end
irb(main):023:1>   matrix2
irb(main):024:1> end
=> :rotate90
irb(main):025:0> rotate90(matrix1)
ArgumentError: wrong number of arguments (given 1, expected 0)
    from (irb):11:in `length'
    from (irb):11:in `rotate90'
    from (irb):25
    from /usr/bin/irb:11:in `<main>'
4

2 回答 2

1

您的错误的答案在这一行:

mat1_size = matrix_input.size -1

-1 是一个负数,Ruby 将其解释为:

mat1_size = matrix_input.size(-1)

修复当然是:

mat1_size = matrix_input.size - 1

但是您的程序仍然存在一些错误,但这是您原始问题的答案。

于 2019-12-06T08:58:33.153 回答
0

如果我正确理解您要完成的工作,则可以按以下方式完成。

def rotate90(arr)
  arr.map(&:reverse).transpose
end

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

rotate90(arr)
  #=> [[8, 2, 6],
  #    [5, 7, 9],
  #    [1, 4, 3]]

注意

arr.map(&:reverse)
  #=> [[8, 5, 1],
  #    [2, 7, 4],
  #    [6, 9, 3]] 

arr.map(&:reverse)大致是

arr.map { |a| a.reverse }

另请注意

4.times.reduce(arr) { |a,_| rotate90(a) }
  #=> [[1, 5, 8],
  #    [4, 7, 2],
  #    [3, 9, 6]] 

返回原始数组。

我从评论中看到,OP 忘了提到既不能使用Array#transposeArray#reverse不能使用。在这种情况下,我们可以采取不同的方法。

观察如果arr_new是正在构造的数组,那么:

arr_new[i][j] = arr[arr.size-1-j][i]

对于所有0 <= i <= arr.size-10 <= j <= arr.size-1。因此,我们可以计算arr_new如下:

arr_size = arr.size
  #=> 3 
last_idx = arr_size - 1
  #=> 2 
Array.new(arr_size) { |i| Array.new(arr_size) { |j| arr[j][last_idx-i] } }
  #=> [[8, 2, 6],
  #    [5, 7, 9],
  #    [1, 4, 3]]
于 2019-12-06T06:32:21.983 回答