添加矩阵的对角线差异

时间:2018-04-26 16:51:37

标签: ruby loops matrix

HackerRank对角线差异问题。

将矩阵的两个对角线的总和之间的绝对差值打印为单个整数。

问题链接:https://www.hackerrank.com/challenges/diagonal-difference/problem

我一直在努力解决Ruby中的这个问题。我碰巧找到了别人想通的答案。

我现在请求帮助理解这种方法的工作原理。我想了解它在做什么。我对整个循环感到困惑。

a.each_with_index do |array, index|
  left_right += array[index]
  right_left += array[-index-1]

有人可以一步一步地解释这段代码中发生了什么,这样我就可以学习并更好地理解Ruby了吗?谢谢。

def diagonalDifference(a)
  left_right=0
  right_left=0
  a.each_with_index do |array, index|
    left_right += array[index]
    right_left += array[-index-1]
  end
  v = right_left - left_right
  return v.abs
end

4 个答案:

答案 0 :(得分:2)

见以下

11 2 4
4 5 6
10 8 -12
So, a = [ [11, 2, 4], [4, 5, 6], [10, 8, -12] ]

现在为a.each_with_index do |array, index|的参考each_with_index方法。在第一次迭代array will be [11, 2, 4] & index will be 0期间。 array[0] = 11& array[-0-1] i.e. array[-1] = 4 类似地,对于第二次迭代array[1] = 5& array[-1-1] i.e. array[-2] = 5&安培;等等。

你会得到

2.3.1 :360 > left_right # 11 + 5 - 12
 => 4 
2.3.1 :361 > right_left # 4 + 5 + 10
 => 19 
2.3.1 :362 > v = right_left - left_right
 => 15 

v.abs用于返回v is negativeNumeric类的return方法{。}}的绝对差异。

注意: - {{1}}关键字是可选的,如果它是方法中的最后一个非注释行。

答案 1 :(得分:2)

nxn矩阵a的{​​{3}}(或主要辅助对角线)由元素a[n-1][0],{{1}组成},...,a[n-2][1]a[1][n-2]

部分问题是变量没有给出描述性名称。我会写如下。

a[0][n-1]]

我希望def diagonal_difference(arr) main_diagonal_sum=0 main_skew_diagonal_sum=0 arr.each_with_index do |row, i| main_diagonal_sum += row[i] main_skew_diagonal_sum += row[-i-1] end (main_diagonal_sum - main_skew_diagonal_sum).abs end 可能是代码中最令人困惑的部分。假设row[-i-1],然后是i = 0,这是row[-0-1] #=> row[-1]的最后一个元素。 rowi = 1row[-1-1] #=> row[-2]的倒数第二个元素,依此类推。这可以写成row

如果此处的方法返回执行的最后一个语句的返回值(方法返回之前),则不需要注意row[row.size-i-1]

让我们在方法中添加一些return语句并通过一个示例。

puts

主对角线和为def diagonal_difference(arr) puts "arr=#{arr}" main_diagonal_sum=0 main_skew_diagonal_sum=0 arr.each_with_index do |row, i| puts "row=#{row}, i=#{i}" main_diagonal_sum += row[i] puts " row[#{i}]=#{row[i]}, main_diagonal_sum=#{main_diagonal_sum}" main_skew_diagonal_sum += row[-i-1] puts " row[-#{i}-1]=#{row[-i-1]}, main_skew_diagonal_sum=#{main_skew_diagonal_sum}" end (main_diagonal_sum - main_skew_diagonal_sum).abs end arr = [[1,2,3], [4,5,6], [9,8,7]] ,主偏斜对角线和为1+5+7 #=> 13,因此我们希望该方法返回3+5+9 #=> 17

(13-17).abs #=> 4

打印以下内容。

diagonal_difference(arr)
  #=> 4

使用方法main skew diagonal(高级)

两个对角线上的元素之和可以替代地使用方法arr=[[1, 2, 3], [4, 5, 6], [9, 8, 7]] row=[1, 2, 3], i=0 row[0]=1, main_diagonal_sum=1 row[-0-1]=3, main_skew_diagonal_sum=3 row=[4, 5, 6], i=1 row[1]=5, main_diagonal_sum=6 row[-1-1]=5, main_skew_diagonal_sum=8 row=[9, 8, 7], i=2 row[2]=7, main_diagonal_sum=13 row[-2-1]=9, main_skew_diagonal_sum=17 和辅助方法Matrix#trace计算(如在逆时针方向上滚动90度),这会转换主偏斜对角线到主对角线。

roll

这允许我们写下以下内容。

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

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

答案 2 :(得分:1)

旁注: NB 为了格式化,我将此作为答案发布,而不是评论;它不应该被投票。

您发布的片段的ruby惯用版本将更多:

def diagonal_difference(a)
  a.each.with_object([0, 0]).with_index do |(e, left_right), idx|
    left_right[0] += array[idx]
    right_left[1] += array[-idx-1]
  end.reduce(:-).abs
end

答案 3 :(得分:1)

您可以使用此Matrix library中建议的answer

require 'matrix'
(Matrix[*arr].tr - Matrix[*arr.reverse].tr).abs

其中arr是深度为2且长度为n且每个子数组的长度为n的数组,例如[[a,b],[c,d]]