我需要方阵中第一个和第二个对角线之间的差
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))
有几件事需要注意:
- 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-1
0。第一个表格中的arr:
并没有真正给你任何你没有的信息。您应该使用_
省略该关键字标签最重要的是:您可以迭代arr.indices.reversed()
以获得从高到低的索引序列,从而允许您从右上到左下访问行元素。
这是避免您遇到错误的关键。您忘记了关键的- 1
,这就是您访问索引越界并导致崩溃的原因。如果您只使用反转的方法先反转数组,然后访问第15个CCD_元素,您将返回最后一个n
的值,而无需记住执行acc.count - n - 1
。
要选择行,您仍然需要常规的";正向指数";,如CCD_ 18。
您可以使用zip(_:_:)
同时迭代它们;正向指数";选择该行;向后索引";从该行中选择一个特定的数字。
感谢@Rob的建议。
更新注释
我修改了我的推荐信。我之前建议使用arr.indices
0,因为我误解了reversed
的结果将是对只执行恒定时间索引运算的数组的视图。事实并非如此。这些reversed
调用中的每一个都在对数组进行完全线性反转。