أطول سلسلة استمرار
جزء من قسم المنطق والتدفق في رحلة 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
}النمط، "تتبع التشغيل الحالي + الأفضل حتى الآن"، يتكرر في العديد من المشكلات. تعرف عليه مرة واحدة وسيبقى ملكك للأبد.
التحدي
متوسطاقرأ سطرًا واحدًا من المدخلات: قائمة مفصولة بفاصلة من مدخلات 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'
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتدفق
1النصوص بعمق
العد والفهارسحالة الأحرف وإزالة الفراغاتالبحث في النصوصتقسيم ودمج النصوصاستبدال النصوص الفرعيةمراجعة - التحقق من اسم المستخدم4المجموعات
إنشاء المجموعاتالاتحاد والتقاطعالطرح والفرق المتماثلالمجموعات الجزئية والشاملةمراجعة - تصفية الـ Tag7مشروع - متتبع العادات
نظرة عامة على المشروعتحديد كمكتمل2النطاقات والخطوات
المغلقة مقابل نصف المفتوحةالخطوة (Stride)دوال النطاقاتالنطاقات في Switchملخص - شبكة التقويم5الدوال من الرتبة العليا - الجزء الأول
MapFilterReduceربط Map و Filter و Reduceمراجعة - إحصائيات الكلمات