【问题标题】:Diagonal difference in PythonPython中的对角线差异
【发布时间】:2022-09-25 23:59:34
【问题描述】:

我正在研究一个 HackerRank 问题,但我不明白其中的一些逻辑:

if (i == j):
    left += a[i][j]

上面是说如果行/列索引相同([1,1],[2,2],[3,3]),将在这些坐标处找到的值附加到列表 \'left\'

我不明白下面代码中的逻辑。对我来说,它看起来像是在行索引 + 列索引 = 3 (n-1) 的坐标处找到附加值,但我不认为这是正确的。下面的代码会翻译成什么?

if (i + j) == (n - 1):
    right += a[i][j]

下面是带有样本输入 a 和 n 的函数。

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

n = 4
def xsum(a, n):
    left = 0
    right = 0
    for i in range(0, n):
        for j in range(0, n):
            if (i == j):
                left += a[i][j]
            if (i + j) == (n - 1):
                right += a[i][j]
    return (abs(left-right))
  • 原来的问题是什么?
  • @BrokenBenchmark \“将矩阵的两个对角线之和之间的绝对差返回为单个整数。\”所以左右对角线和之间的绝对差。第一行逻辑从左对角线获取值,但我不明白如何遍历右对角线。

标签: python diagonal


【解决方案1】:

这看起来很像它工作太努力了。

如果我们想计算那个“左”对角线。

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

left = []
for i in range(0, 4):
    left.append(a[i][i])

或者:

left = [a[i][i] for i in range(0, 4)]

找到“正确的”对角线。

right = [a[i][3 - i] for i in range(0, 4)]

如果我们需要查看它如何生成一组索引以索引到a,我们可以使用以下内容:

>>> [(i, 3 - i) for i in range(0, 4)]
[(0, 3), (1, 2), (2, 1), (3, 0)]

产生:[4, 7, 2, 5]。如果你需要它反转。

right = [a[3 - i][i] for i in range(0, 4)]

这产生:[5, 2, 7, 4]

如果我们需要左对角线的和,我们只需要使用sum函数:left_sum = sum(left)

我专门为 4x4 矩阵编写了这些示例。将其推广到更大或更小的矩阵应该很简单。

【讨论】:

  • 我已经玩过你发送的这段代码了。它返回正确的值,但我仍然不明白 3-1 如何穿过右对角线。
  • 好吧,当i0 时,我们将访问a[0][3 - 0] 或只是a[0][3]。当i1时,我们访问a[1][2],当i2a[2][1],当i3a[3][0]
  • 我现在明白了。并将其编写为列表理解使其更加优雅/高效。看到以这种方式剖析的代码真的帮助我理解了。
【解决方案2】:

下面的代码会翻译成什么?

当且仅当行和列索引总和为n - 1 时,该代码才利用元素位于右对角线上的事实。然后它将给定(i, j) 对的值添加到right

这可以使用以下矩阵进行可视化:每个条目是其行和列索引的总和:

print([[i + j for i in range(4)] for j in range(4)])
#[[0, 1, 2, 3],
# [1, 2, 3, 4],
# [2, 3, 4, 5], 
# [3, 4, 5, 6]]
# (notice that the n - 1 == 3, and the 3s are only on the antidiagonal!)

这是一个关于正确性的问题,与效率不同。如果您想知道这段代码是否有效,答案是否定的:请参阅 Chris 的回答。

【讨论】:

  • 这非常有帮助,我现在明白正确的对角线索引将加起来为 n-1。对角线! ??
【解决方案3】:

`def对角线差异(arr):

mat = len(arr[0]) #type of matrix e.g(3by3)
left_sum = 0
right_sum =0
k =mat-1 #rightmost element accessor 
for i in range(mat):
    left_sum += arr[i][i]    
for j in range(mat):
    right_sum += arr[j][k]
    k-=1
return abs(right_sum - left_sum)`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多