Update: einfachere Lösung: Teilen des Arrays in Scheiben von positive Elemente und bestimmen die maximale Scheibenlänge:
let numbers = [1,3,4,-1,-2,5,2,-2,-3,-4,5]
let maxConsecutive = numbers.split(whereSeparator: { $0 <= 0 }).map { $0.count }.max()!
print(maxConsecutive) // 3
Alte Antwort:) Mit den Ideen von Swift running sum:
let numbers = [1,3,4,-1,-2,5,2,-2,-3,-4,5]
let maxConsecutive = numbers.map({
() -> (Int) -> Int in var c = 0; return { c = $0 > 0 ? c + 1 : 0; return c }
}()).max()!
Hier map()
bildet jedes Array-Element zu der Anzahl der aufeinanderfolgenden positiven Zahlen bis zu der Position Elemente, in diesem Fall
[1, 2, 3, 0, 0, 1, 2, 0, 0, 0, 1]
Die Transformation wird als "sofort ausgewerteter Abschluss" erstellt, um eine Variable c
zu erfassen, die die aktuelle Nummer enthält aufeinanderfolgende positive Zahlen. Die Transformation inkrementiert oder setzt c
, zurück und gibt den aktualisierten Wert zurück.
Wenn das Array möglicherweise groß ist, dann ist es ändern
let maxConsecutive = numbers.lazy.map(...).max()!
so daß die maximale Lauflänge, ohne eine Zwischen Array bestimmt wird.
wir in Zahlen für die Nummer suchen: 1,3,4 - alle positiv, wir zählen sie - seine 3. dann zwei negativen Zahlen, 2 positiven, 3 negative und 1 positive . Also, maximal aufeinander folgende positive Zahlen - 3. – Anton