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

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

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

الـ سلسلة هي تتابع من الأيام المتتالية التي تم فيها وضع علامة الإنجاز على العادة. بالنسبة للأيام [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
}

النمط، "تتبع التشغيل الحالي + الأفضل حتى الآن"، يتكرر في العديد من المشكلات. تعرف عليه مرة واحدة وسيبقى ملكك للأبد.

challenge icon

التحدي

متوسط

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

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

<habit>: streak=<n>

للمدخلات read:1,read:2,read:3,read:5,workout:2,workout:4، يكون المخرج:

read: streak=3
workout: streak=1

ورقة مرجعية

أطول سلسلة – مسح خطي يتتبع التتابع الحالي والأفضل حتى الآن:

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
}

تكون الأيام متتالية عندما يساوي كل يوم اليوم السابق له زائد واحد. أعد تعيين run إلى 1 عند وجود فجوة؛ قم بتحديث best في كل تكرار.

جرّب بنفسك

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اختبر نفسك

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

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