微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

快速最大连续正数

如何使用闭包计算最大连续正数?

var numbers = [1,3,4,-1,-2,5,2,-3,-4,5]
//in this case it should be 3

print(numbers.reduce(0,{ $1 > 0 ? $0 + 1 : $0 } ))//this counts total positive numbers

解决方法

更新:更简单的解决方案:将数组拆分为多个切片
正元素,并确定最大切片长度:

let  numbers = [1,5]
let maxConsecutive = numbers.split(whereSeparator: { $0 <= 0 }).map { $0.count }.max()!
print(maxConsecutive) // 3

老答案:)使用Swift running sum的想法:

let  numbers = [1,5]

let maxConsecutive = numbers.map({
    () -> (Int) -> Int in var c = 0; return { c = $0 > 0 ? c + 1 : 0; return c }
}()).max()!

这里map()将每个数组元素映射到连续正数的计数
在这种情况下,数字到元素位置

[1,1,1]

转换创建为“立即评估
闭包“捕获一个保存当前数字的变量c
连续的正数.转换增加或重置c,
并返回更新的值.

如果数组可能很大,则将其更改为

let maxConsecutive = numbers.lazy.map( ... ).max()!

这样就可以确定最大运行长度而无需创建中间数组.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐