对正方形阵列中的对角线求和时,索引超出范围(致命错误)



我需要方阵中第一个和第二个对角线之间的差

func diagonalDifference(arr: [[Int]]) -> Int {
var sumFirstDiag = 0
for i in 0...arr.count-1 {
sumFirstDiag = sumFirstDiag + Int(arr[i][i])
}
var sumSecondDiag = 0
for y in 0...arr.count-1 {
sumSecondDiag = sumSecondDiag + Int(arr[y][arr.count - y])
}
print(abs(sumFirstDiag - sumSecondDiag))
return abs(sumFirstDiag - sumSecondDiag)
}
let array = [
[1,2,3,11],
[4,5,6,12],
[7,8,9,90],
[1,3,5,7]]
diagonalDifference(arr: array)

错误消息:

致命错误:索引超出范围:Swift/ContiqueArrayBuffer.Swift文件,第444行

我想我会分享一种更实用的方法来解决这个问题:

// The sum of elements along the diagonal from top-left to bottom-right
func diagonal1Sum(_ input: [[Int]]) -> Int {
input.indices
.map { input[$0][$0] }
.reduce(0, +) // I wish Swift had a built-in `.sum` :(
}
// The sum of elements along the diagonal from top-right to bottom-left
func diagonal2Sum(_ input: [[Int]]) -> Int {
zip(input.indices, input.indices.reversed())
.map { input[$0][$1] }
.reduce(0, +)
}
// The absolute value of the difference in sums of the two diagonals.
func diagonalDifference(_ input: [[Int]]) -> Int {
abs(diagonal1Sum(input) - diagonal2Sum(input))
}
let array = [
[1,2,3,11],
[4,5,6,12],
[7,8,9,90],
[1,3,5,7],
]
print(diagonalDifference(array))

有几件事需要注意:

  1. CCD_ 1应仅表示为CCD_。第一个表单在空数组上崩溃。看见https://github.com/amomchilov/Blog/blob/master/Proper%20Array%20Iteration.md
  • arr[i][i]已经是Int,无需将其转换为Int
  • sumSecondDiag = sumSecondDiag + something更简单地写成sumSecondDiag += something
  • arr这样没有意义的参数名称不应该是关键字标签。比较diagonalDifference(arr: array)0...arr.count-10。第一个表格中的arr:并没有真正给你任何你没有的信息。您应该使用_省略该关键字标签
  • 您不应该打印出这样计算结果的函数的结果。返回结果,然后打印。这让函数的用户可以选择是否打印
  • 最重要的是:您可以迭代arr.indices.reversed()以获得从高到低的索引序列,从而允许您从右上到左下访问行元素。

    这是避免您遇到错误的关键。您忘记了关键的- 1,这就是您访问索引越界并导致崩溃的原因。如果您只使用反转的方法先反转数组,然后访问第15个CCD_元素,您将返回最后一个n的值,而无需记住执行acc.count - n - 1

    要选择行,您仍然需要常规的";正向指数";,如CCD_ 18。

    您可以使用zip(_:_:)同时迭代它们;正向指数";选择该行;向后索引";从该行中选择一个特定的数字。

    感谢@Rob的建议。

    更新注释

    我修改了我的推荐信。我之前建议使用arr.indices0,因为我误解了reversed的结果将是对只执行恒定时间索引运算的数组的视图。事实并非如此。这些reversed调用中的每一个都在对数组进行完全线性反转。

    最新更新