2017-11-06 5 views
4

Wie kann man die maximalen aufeinanderfolgenden positiven Zahlen mit Verschlüssen zählen? Swift maximale aufeinanderfolgende positive Zahlen

var numbers = [1,3,4,-1,-2,5,2,-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 
+0

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

Antwort

6

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.

+0

Danke, das ist genau was ich will - einfache und kurze Lösung! Wie kann ich die durchschnittliche fortlaufende positive Zahl finden? Mit map erhalten wir [1, 2, 3, 0, 0, 1, 2, 0, 0, 0, 1], was nun zu verwenden, zu filtern und zu reduzieren? Das Ergebnis sollte [3,2,1] sein, dann Summe 6 dividiere durch Zählung 3 = 2 – Anton

+0

@Anton: Inspiriert von Ihrer neuen Frage, habe ich diese Antwort mit einer viel einfacheren Lösung aktualisiert. –

+0

vielen vielen dank! – Anton

2
var currentResult = 0 
var maxResult = 0 
for i in numbers { 
    currentResult = i > 0 ? currentResult + 1 : 0 
    if maxResult < currentResult { 
     maxResult = currentResult 
    } 
} 
print(maxResult) 

Lösung ohne Verschlüsse

+0

Danke, aber ich brauche Lösung mit Schließungen) – Anton

+0

print (numbers.reduce (0) {$ 1> 0? $ 0 + 1: 0}) - das gibt mir 6 in diesem Beispiel - alle positive Zahlen. Wie bekomme ich mit Closures (in diesem Fall 3) maximale fortlaufende Nummern? – Anton

+0

Dies liefert '0' für das Array' [1,2,3,4] ' –

2
var numbers = [1, 3, 4, -1, -2, 5, 2, -2, -3, -4, 5] 

let result = numbers.reduce((current: 0, max: 0)) { result, number in 
    var value = result 

    if number > 0 { 
     value.current += 1 
     value.max = max(value.current, value.max) 
    } else { 
     value.current = 0 
    } 

    return value 
} 



result.max 
+0

Gute Idee, aber es scheint einige Probleme zu geben. Es gibt 0 für das angegebene Array zurück. –

+1

@MartinR du hast recht! Es gab ein Problem, aber jetzt wurde es behoben. Prost :) – Arsen

1

generieren Teilfolgen:

let numbers = [1,3,4,-1,-2,5,2,-2,-3,-4,5] 
let subsequences: [[Int]] = numbers.reduce(into: []) { (result, number) in 
    guard 
     var currentSequence = result.last, 
     let lastNumber = currentSequence.last 
    else { 
     result = [[number]] 
     return 
    } 

    if number == lastNumber + 1 { 
     currentSequence.append(number) 
     result.removeLast() 
     result.append(currentSequence) 
    } else { 
     result.append([number]) 
    } 
} 
let longest = subsequences.max { $0.count < $1.count } 
print(subsequences) 
print("Longest subsequence: \(longest)") 
print("Longest length: \(longest?.count)") 
Verwandte Themen