Hackerrank对角线差值问题:我的Python代码报错求排查
分析与解决方阵对角线和差值问题
咱们来一步步拆解你的代码问题,找到问题根源并给出解决方案:
第一次尝试代码的问题
你的第一段代码存在几个关键错误:
range(arr+1):arr是传入的二维数组,不能直接和整数1做加法运算,要获取方阵的阶数,应该用len(arr)(方阵的行数就是它的阶数n)。- 代码里用到了变量
n,但这个变量在函数内完全没有定义,运行时会直接抛出NameError。 - 其实没必要额外定义
i和j,循环变量x本身就可以用来做索引,能大幅简化代码逻辑。
第二次尝试代码的错误原因
你遇到的IndexError是右对角线的索引计算错误导致的:
当用len(arr)-x时,以3阶方阵为例,len(arr)=3:
- 当
x=0时,计算出的索引是3-0=3,但数组索引是从0开始的,最大有效索引是2,自然就超出范围了。
正确的右对角线索引应该是len(arr)-1 -x,这样: - x=0 → 3-1-0=2(对应第一行最后一个元素,正确)
- x=1 →3-1-1=1(对应第二行中间元素,正确)
- x=2 →3-1-2=0(对应第三行第一个元素,正确)
修正后的代码
这里给你一个简洁且正确的版本:
def diagonalDifference(arr): left_sum = 0 right_sum = 0 n = len(arr) for x in range(n): left_sum += arr[x][x] # 左对角线:行索引等于列索引 right_sum += arr[x][n - 1 - x] # 右对角线:列索引 = 阶数-1 - 行索引 return abs(left_sum - right_sum)
逻辑说明
- 左对角线的元素有个明显特点:行号和列号完全相同,所以直接用
arr[x][x]累加即可。 - 右对角线的元素则是列号 = 方阵阶数-1 - 行号,这样就能从右上角依次遍历到左下角。
- 最后返回两个对角线和的绝对差值,就完成了需求。
用你给出的示例输入测试:
3 11 2 4 4 5 6 10 8 -12
左对角线和:11+5+(-12)=4;右对角线和:4+5+10=19;绝对差值|4-19|=15,和示例输出完全一致。
内容的提问来源于stack exchange,提问作者PudgeKim
相关产品推荐
相关产品推荐

