这个 Swift 求方阵对角差的代码有什么问题?
What is the problem with this Swift Code for finding the Diagonal Difference of a square array?
我正在处理一些 HackerRank 问题解决挑战。我现在使用的语言是Swift。 objective 是计算 方阵 与 n 列和行的对角差。练习的逻辑非常简单,我已经顺利完成了,但是,问题是运行时错误,它发生在 运行 程序 ~ no response on stdout
上。这是错误的屏幕截图:
这是我的代码(diagonalDifference()
函数):
func diagonalDifference(arr: [[Int]], n: Int) -> Int {
// Write your code here
var primarySum = 0
var secondarySum = 0
for i in 0..<n {
primarySum += arr[i][i]
secondarySum += arr[i][n - (i - 1)]
}
var diagDifference = abs(primarySum - secondarySum)
return diagDifference
}
我在做这些挑战时注意到的另一件事是,当我在讨论选项卡的 Swift 中查找解决方案时,大多数人不包括 n
作为参数在函数中。但是,当我不包含 n
作为参数时,会出现运行时错误。
下面是剩余的代码供参考:
import Foundation
/*
* Complete the 'diagonalDifference' function below.
*
* The function is expected to return an INTEGER.
* The function accepts 2D_INTEGER_ARRAY arr as parameter.
*/
func diagonalDifference(arr: [[Int]], n: Int) -> Int {
// Write your code here
var primarySum = 0
var secondarySum = 0
for i in 0..<n {
primarySum += arr[i][i]
secondarySum += arr[i][n - (i - 1)]
}
var diagDifference = abs(primarySum - secondarySum)
return diagDifference
}
let stdout = ProcessInfo.processInfo.environment["OUTPUT_PATH"]!
FileManager.default.createFile(atPath: stdout, contents: nil, attributes: nil)
let fileHandle = FileHandle(forWritingAtPath: stdout)!
guard let n = Int((readLine()?.trimmingCharacters(in: .whitespacesAndNewlines))!)
else { fatalError("Bad input") }
var arr = [[Int]]()
for _ in 1...n {
guard let arrRowTemp = readLine()?.replacingOccurrences(of: "\s+$", with: "", options: .regularExpression) else { fatalError("Bad input") }
let arrRow: [Int] = arrRowTemp.split(separator: " ").map {
if let arrItem = Int([=12=]) {
return arrItem
} else { fatalError("Bad input") }
}
guard arrRow.count == n else { fatalError("Bad input") }
arr.append(arrRow)
}
guard arr.count == n else { fatalError("Bad input") }
let result = diagonalDifference(arr: arr, n: n)
fileHandle.write(String(result).data(using: .utf8)!)
fileHandle.write("\n".data(using: .utf8)!)
有人能告诉我我应该怎么做吗,我的函数应该 return diagDifference
。我对 Swift 比较满意,但仍有部分代码我不是很清楚,例如:
fileHandle.write(String(result).data(using: .utf8)!)
fileHandle.write("\n".data(using: .utf8)!)
我对此的理解是,代码使用 diagonalDifference()
函数的调用写入文件。但是,当我在 Swift 文档中查找时,我发现 write()
方法已被弃用。
没有具体考虑这个问题,如果您可以对我的代码或逻辑提出任何改进建议,请提出。
您在此行出现数组越界错误。想想当 i
是 0
:
时会发生什么
secondarySum += arr[i][n - (i - 1)]
改为:
secondarySum += arr[i][n - i - 1]
我正在处理一些 HackerRank 问题解决挑战。我现在使用的语言是Swift。 objective 是计算 方阵 与 n 列和行的对角差。练习的逻辑非常简单,我已经顺利完成了,但是,问题是运行时错误,它发生在 运行 程序 ~ no response on stdout
上。这是错误的屏幕截图:
这是我的代码(diagonalDifference()
函数):
func diagonalDifference(arr: [[Int]], n: Int) -> Int {
// Write your code here
var primarySum = 0
var secondarySum = 0
for i in 0..<n {
primarySum += arr[i][i]
secondarySum += arr[i][n - (i - 1)]
}
var diagDifference = abs(primarySum - secondarySum)
return diagDifference
}
我在做这些挑战时注意到的另一件事是,当我在讨论选项卡的 Swift 中查找解决方案时,大多数人不包括 n
作为参数在函数中。但是,当我不包含 n
作为参数时,会出现运行时错误。
下面是剩余的代码供参考:
import Foundation
/*
* Complete the 'diagonalDifference' function below.
*
* The function is expected to return an INTEGER.
* The function accepts 2D_INTEGER_ARRAY arr as parameter.
*/
func diagonalDifference(arr: [[Int]], n: Int) -> Int {
// Write your code here
var primarySum = 0
var secondarySum = 0
for i in 0..<n {
primarySum += arr[i][i]
secondarySum += arr[i][n - (i - 1)]
}
var diagDifference = abs(primarySum - secondarySum)
return diagDifference
}
let stdout = ProcessInfo.processInfo.environment["OUTPUT_PATH"]!
FileManager.default.createFile(atPath: stdout, contents: nil, attributes: nil)
let fileHandle = FileHandle(forWritingAtPath: stdout)!
guard let n = Int((readLine()?.trimmingCharacters(in: .whitespacesAndNewlines))!)
else { fatalError("Bad input") }
var arr = [[Int]]()
for _ in 1...n {
guard let arrRowTemp = readLine()?.replacingOccurrences(of: "\s+$", with: "", options: .regularExpression) else { fatalError("Bad input") }
let arrRow: [Int] = arrRowTemp.split(separator: " ").map {
if let arrItem = Int([=12=]) {
return arrItem
} else { fatalError("Bad input") }
}
guard arrRow.count == n else { fatalError("Bad input") }
arr.append(arrRow)
}
guard arr.count == n else { fatalError("Bad input") }
let result = diagonalDifference(arr: arr, n: n)
fileHandle.write(String(result).data(using: .utf8)!)
fileHandle.write("\n".data(using: .utf8)!)
有人能告诉我我应该怎么做吗,我的函数应该 return diagDifference
。我对 Swift 比较满意,但仍有部分代码我不是很清楚,例如:
fileHandle.write(String(result).data(using: .utf8)!)
fileHandle.write("\n".data(using: .utf8)!)
我对此的理解是,代码使用 diagonalDifference()
函数的调用写入文件。但是,当我在 Swift 文档中查找时,我发现 write()
方法已被弃用。
没有具体考虑这个问题,如果您可以对我的代码或逻辑提出任何改进建议,请提出。
您在此行出现数组越界错误。想想当 i
是 0
:
secondarySum += arr[i][n - (i - 1)]
改为:
secondarySum += arr[i][n - i - 1]