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ü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.

challenge icon

Görev

Orta

Tek 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=1

Kopya 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
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