swift:平均连续正数

时间:2017-11-07 14:38:37

标签: arrays swift closures

我们有一个数组,例如:

let numbers = [-1.0,1.0,3.0,4.0,-1.0,-2.0,2.0]

我们知道如何获得最大连续正数:

let pos = numbers.map({ () -> (Double) -> Int in var c = 0; return { c = $0 > 0 ? c + 1 : 0; return c } }()) 
// [0, 1, 2, 3, 0, 0, 1]
let maxConsecutivePos = pos.max()! 
//3

我们怎样才能以相同的方式找到平均连续正数,在我们的例子中使用闭包和pos数组?对于这个例子,我们将sum(3 + 1)除以2 - > 2是预期的产出。

2 个答案:

答案 0 :(得分:6)

可能的解决方案:将数组拆分为连续的切片 正数,然后计算平均切片长度:

let numbers = [-1.0, 1.0, 3.0, 4.0, -1.0, -2.0, 2.0]

let slices = numbers.split(whereSeparator: { $0 <= 0 })
// --> [ArraySlice([1.0, 3.0, 4.0]), ArraySlice([2.0])]

let avg = Double(slices.reduce(0, { $0 + $1.count })) / Double(slices.count)
print(avg) // 2.0

答案 1 :(得分:1)

你基本上将每个元素与下一个元素进行比较并检查,如果下一个元素更少。如果它更小,那么它是最大值,你用它来计算平均值。

let array = [0, 1, 2, 3, 0, 0, 1]

func maxConsAvg(array: [Int]) -> Double? {
    guard array.count > 1 else {
        return array.first.flatMap({ Double($0) })
    }
    let array = array + [0]
    let maxs = zip(array.dropLast(), array.dropFirst())
        .flatMap { (first, second) -> Int? in
            return first > second ? first : nil
        } //[3, 1]
    return Double(maxs.reduce(0, +)) / Double(maxs.count)
}

maxConsAvg(array: array) //2