我正在研究 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))
这看起来太辛苦了。
如果我们想计算“左”对角线。
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 矩阵编写了这些示例。对于更大或更小的矩阵应该很容易推广这一点。
下面的代码会翻译成什么?
该代码利用了这样一个事实:当且仅当行索引和列索引之和为
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 的回答。
def diagonalDifference(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)
def diagonalDifference(arr):
n = len(arr)
left_to_right = 0
right_to_left = 0
for i in range(n):
left_to_right += arr[i][i]
right_to_left += arr[i][n - (i + 1)]
return abs(left_to_right - right_to_left)