swift - Swift:使用 for-in 循环,在 Int 数组中找到最大的 value

对不起,我是新来的,我正在学习 iOS 从头开始开发。

我知道为了在 Int 数组中找到最大的 value,我们可以使用属性“.max()”。但我需要使用 for-in 循环来做到这一点。有人可以帮助我吗?我知道这很容易,但我找不到它,也不知道如何自己做。谢谢。

回答1

Swift 的 array.max() 的复杂度是 O(N) ,就像 for-in 循环一样。

Swift 中的for-in 有两种方法。

第一个解决方案(这里的 for-in 就像每个 value 一样)

let arr = [1, 4, 3]
var max = Int.min

// get each value
for val in arr {
    if (max < val) {
        max = val
    }
}

第二种解决方案(这里的 for-in 是针对每个索引的)

let arr = [1, 4, 3]
var max = Int.min

// get each index
for i in 0..<arr.count {
    if (max < arr[i]) {
        max = arr[i]
    }
}

两种方式具有相同的输出。在选择在您的进一步代码中使用哪个时,请随意。

回答2

如果您的数组为空,则返回 Int.min 作为最大值 value 是不正确的。

返回一个可选的更正确:

var max: Int? = nil

for val in arr {
    guard let maxSoFar = max else {
        max = val
        continue
    }

    if val > maxSoFar {
        max = val
    }
}

尽管您可能更喜欢将其编写为 Collection 的扩展,例如:

extension Collection where Element: Comparable {
    func mMax() -> Element? {
        var max: Element? = nil

        // get each value
        for val in self {
            guard let maxSoFar = max else {
                max = val
                continue
            }

            if val > maxSoFar {
                max = val
            }
        }

        return max
    }

}

[1, 2, 3].mMax() // 3

([] as [Int]).mMax() // nil

["a", "c", "b"].mMax() // "c"

或者更一般地说,它不依赖于 '>' 函数,例如:

extension Collection {
    func mMax(by compare: (Element, Element) -> Bool) -> Element? {
        var max: Element? = nil

        // get each value
        for val in self {
            guard let maxSoFar = max else {
                max = val
                continue
            }

            if compare(val, maxSoFar) {
                max = val
            }
        }

        return max
    }

}

[1, 2, 3].mMax(by: >) // 3

([] as [Int]).mMax(by: >) // nil


let longestString = ["aaa", "a", "aaaaa"].mMax(by: { $0.count > $1.count })  /// "aaaaa"