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
答案 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 negative
,Numeric
类的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]
的最后一个元素。 row
,i = 1
,row[-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]]
。