En Uzun Seri
Coddy'nin Swift Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 35 / 56.
Bir seri, bir alışkanlığın tamamlandı olarak işaretlendiği ardışık günlerin dizisidir. [1, 2, 3, 5, 6] günleri için en uzun seri 3'tür (1-3. günler).
Sıralanmış bir gün listeniz olduğunda bunu hesaplamak basit bir doğrusal taramadır: her günü bir öncekiyle karşılaştırın, ardışık olduklarında mevcut seriyi uzatın, aksi takdirde sıfırlayın.
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
}"Mevcut durumu takip et + şimdiye kadarki en iyi" kalıbı birçok problemde tekrarlanır. Bunu bir kez kavradığınızda sonsuza dek sizin olur.
Görev
OrtaTek bir girdi satırı okuyun: virgülle ayrılmış habit:day girişlerinden oluşan bir liste. Önceki derste yaptığınız sözlüğün aynısını oluşturun, ardından her alışkanlık için hafta boyunca en uzun ardışık gün serisini (streak) hesaplayın.
Alışkanlıkları alfabetik sırayla, her satıra bir tane gelecek şekilde şu formatta yazdırın:
<habit>: streak=<n>read:1,read:2,read:3,read:5,workout:2,workout:4 girdisi için çıktı şöyledir:
read: streak=3
workout: streak=1Kopya kağıdı
En uzun seri – mevcut seriyi ve şimdiye kadarki en iyiyi takip eden doğrusal tarama:
func longestStreak(_ days: [Int]) -> Int {
let sorted = days.sorted()
var best = 0, 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
}Günler, her biri bir öncekinin bir fazlasına eşit olduğunda ardışıktır. Bir boşlukta run değerini 1 olarak sıfırlayın; her yinelemede best değerini güncelleyin.
Kendin dene
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)
}
}
// YAPILACAK: alışkanlık başına en uzun seri, isme göre sıralanmış şekilde 'isim: seri=n' olarak yazdır
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1Stringler Derinlemesine
Sayma ve İndekslerBüyük-Küçük Harf ve KırpmaStringlerde AramaBölme ve BirleştirmeAlt Stringleri DeğiştirmeÖzet - Kullanıcı Adı Kontrolü4Kümeler
Küme OluşturmaBirleşim ve KesişimFark ve Simetrik FarkAlt Küme ve Üst KümeÖzet - Etiket Filtresi7Proje - Alışkanlık Takibi
Projeye Genel BakışTamamlandı Olarak İşaretle10Proje - Quiz Motoru
Projeye Genel BakışSoruları Sorma2Aralıklar ve Adımlar
Kapalı ve Yarı AçıkStride (Adım)Aralık MetotlarıSwitch İçinde AralıklarÖzet - Takvim Izgarası5Yüksek Mertebeden Fonksiyonlar Bölüm 1
MapFilterReduceMap, filter, reduce zincirlemeÖzet - Kelime İstatistikleri