Menu
Coddy logo textTech

רצף הימים הארוך ביותר

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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. בנה את אותו מילון שבנית בשיעור הקודם, ואז חשב עבור כל הרגל את רצף הימים הרצופים הארוך ביותר במהלך השבוע.

הדפס את ההרגלים בסדר אלפביתי, אחד בכל שורה, בתבנית:

<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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: Swift אונליין