Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

أطول سلسلة استمرار

جزء من قسم المنطق والتدفق في رحلة Swift على Coddy. الدرس 35 من 56.

streak هو تسلسل من days متتالية تم فيها وضع علامة إنجاز على habit. بالنسبة إلى days [1, 2, 3, 5, 6]، فإن أطول تسلسل هو 3 (الأيام من 1 إلى 3).

حسابها مرة واحدة بعد حصولك على قائمة أيام مرتبة هو عملية مسح خطية بسيطة: قارن كل يوم باليوم السابق، ومدّد التسلسل الحالي عندما تكون الأيام متتالية، وإلا فأعد الضبط.

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
}

يتكرر النمط «تتبّع run الحالي + أفضل قيمة حتى الآن» في العديد من المسائل. تعرّف عليه مرة واحدة وسيظل معك إلى الأبد.

challenge icon

التحدي

متوسط

اقرأ سطرًا واحدًا من الإدخال: قائمة مفصولة بفواصل من الإدخالات habit:day. أنشئ القاموس نفسه الذي أنشأته في الدرس السابق، ثم احسب لكل habit أطول streak لأيام متتالية خلال الأسبوع.

اطبع habits بترتيب أبجدي، واحدًا في كل سطر، بالتنسيق:

<habit>: streak=<n>

بالنسبة إلى الإدخال read:1,read:2,read:3,read:5,workout:2,workout:4، يكون الناتج:

read: streak=3
workout: streak=1

جرّب بنفسك

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: أطول سلسلة لكل عادة، اطبع مرتبة حسب الاسم كـ 'name: streak=n'
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق والتدفق

تدرّب بنفسك: Playground لـ Swift