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

جرّب بنفسك

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