Menu
Coddy logo textTech

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ünler dizisidir. [1, 2, 3, 5, 6] günleri için en uzun seri 3 gündür (1-3. günler).

Sıralanmış bir day listeniz olduğunda bunu hesaplamak basit bir doğrusal taramadır: her day değerini önceki değerle karşılaştırın; ardışıklarsa mevcut run değerini 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 run + şimdiye kadarki en iyi” kalıbı birçok problemde tekrarlanır. Bir kez tanı ve sonsuza dek senin olsun.

challenge icon

Görev

Orta

Tek bir giriş satırı okuyun: virgülle ayrılmış habit:day girdilerinden oluşan bir liste. Önceki derste oluşturduğunuz 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 hesaplayın.

Alışkanlıkları alfabetik sırayla, her satıra bir tane gelecek şekilde şu biçimde 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=1

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)
    }
}

// TODO: alışkanlık başına en uzun seri, isme göre sıralı yazdır 'name: streak=n'
quiz iconKendini test et

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

Kendi başına pratik yap: Swift playground