Menu
CoddyTech
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