Serie più lunga
Fa parte della sezione Logica e flusso del percorso Swift di Coddy. Lezione 35 di 56.
Una serie è una sequenza di giorni consecutivi in cui un'abitudine è stata contrassegnata come completata. Per i giorni [1, 2, 3, 5, 6], la serie più lunga è 3 (giorni 1-3).
Calcolarlo una volta ottenuto un elenco di giorni ordinato è una semplice scansione lineare: confronta ogni giorno con quello precedente, prolungando la serie corrente quando sono consecutivi, altrimenti azzerala.
func longestStreak(_ days: [Int]) -> Int {
let sorted = days.sorted()
var best = 0
var run = 0
var prev: Int? = nil
for d in sorted {
if let p = prev, d == p + 1 {
run += 1
} else {
run = 1
}
if run > best { best = run }
prev = d
}
return best
}Lo schema «tieni traccia della serie attuale + del miglior risultato finora» ricorre in molti problemi. Riconoscilo una volta e sarà tuo per sempre.
Sfida
MedioLeggi una singola riga di input: un elenco di voci habit:day separate da virgole. Crea lo stesso dizionario della lezione precedente, poi calcola per ogni abitudine la serie più lunga di giorni consecutivi della settimana.
Stampa le abitudini in ordine alfabetico, una per riga, nel formato:
<habit>: streak=<n>Per l'input read:1,read:2,read:3,read:5,workout:2,workout:4, l'output è:
read: streak=3
workout: streak=1Provalo tu
var habits: [String: [Int]] = [:]
let ops = readLine()!.components(separatedBy: ",")
for op in ops {
let parts = op.components(separatedBy: ":")
let day = Int(parts[1])!
if !(habits[parts[0], default: []].contains(day)) {
habits[parts[0], default: []].append(day)
}
}
// TODO: calcolare la serie consecutiva più lunga per ogni abitudine, stampare in ordine alfabetico per nome nel formato 'name: streak=n'
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Conteggio e indiciMaiuscole, minuscole e rimozione degli spaziRicerca nelle stringheSuddivisione e unioneSostituzione di sottostringheRiepilogo - Verifica del nome utente4Insiemi
Creare insiemiUnione e intersezioneDifferenza e differenza simmetricaSottoinsieme e sovrainsiemeRiepilogo - Filtro per tag7Progetto - Tracciatore di abitudini
Panoramica del progettoSegna come completato10Progetto - Motore di quiz
Panoramica del progettoPorre domande2Intervalli e passi
Intervalli chiusi e semiapertiPassoMetodi degli intervalliIntervalli in switchRiepilogo - Griglia del calendario5Funzioni di ordine superiore Parte 1
MapFilterReduceConcatenare map, filter e reduceRiepilogo - Statistiche sulle paroleEsercitati da solo: Playground Swift