用于查找正方形阵列的对角线差的Swift代码有什么问题?

时间:2020-08-12 12:57:25

标签: arrays swift multidimensional-array logic array-difference

我正在研究一些HackerRank解决问题的挑战。我现在使用的语言是Swift。目的是计算具有 n 列和行的方阵的对角线差异。练习的逻辑很简单,我已经毫不费力地解决了这个问题,但是问题是运行时错误,它在运行程序~ no response on stdout时发生。这是错误的屏幕截图:

Runtime Error Screenshot

这是我的代码(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($0) {
            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)!)

有人可以告诉我该怎么做,我的函数应该返回diagDifference。我对Swift有点满意,但是代码中仍有一些部分我不太清楚,例如:

fileHandle.write(String(result).data(using: .utf8)!)
fileHandle.write("\n".data(using: .utf8)!)

我对此的理解是,代码使用diagonalDifference()函数的调用来写入文件。但是,当我在Swift文档中进行查询时,发现write()方法已被弃用。

没有特别考虑这个问题,如果您总体上可以建议对我的代码或逻辑进行任何改进,请这样做。

1 个答案:

答案 0 :(得分:1)

此行上有一个数组超出范围错误。考虑一下i0时会发生什么:

secondarySum += arr[i][n - (i - 1)]

将其更改为:

secondarySum += arr[i][n - i - 1]