如何使用闭包计算最大连续正数?
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 举报,一经查实,本站将立刻删除。