Minimizing Workload Gaps - codepath/compsci_guides GitHub Wiki

Unit 4 Session 2 Standard (Click for link to problem statements)

U-nderstand

Understand what the interviewer is asking for by using test cases and questions about the problem.

  • Q: What is the goal of the problem?
    • A: The goal is to find the smallest gap in minutes between any two consecutive work sessions.
  • Q: What are the inputs?
    • A: The input is a list of tuples, where each tuple represents a work session with a start and end time in 24-hour format (e.g., 1300 for 1:00 PM).
  • Q: What are the outputs?
    • A: The output is an integer representing the smallest gap in minutes between any two consecutive work sessions.
  • Q: How is the time represented?
    • A: Time is represented in 24-hour format as integers (e.g., 1300 for 1:00 PM).
  • Q: Can work sessions overlap?
    • A: No, it is assumed that work sessions do not overlap.

P-lan

Plan the solution with appropriate visualizations and pseudocode.

General Idea: First, convert the session times into minutes from the start of the day. Then, sort the sessions by start time. Iterate through the sorted list and calculate the gap between the end of one session and the start of the next. Track the smallest gap found.

1) Define a helper function `convert_to_minutes(time)` to convert 24-hour time format to minutes since midnight.
2) Sort the `work_sessions` list by the start time of each session.
3) Initialize a variable `smallest_gap` to infinity.
4) Iterate through the sorted list from the second element:
   a) Calculate the end time of the previous session in minutes.
   b) Calculate the start time of the current session in minutes.
   c) Compute the gap between the two.
   d) If this gap is smaller than `smallest_gap`, update `smallest_gap`.
5) Return the `smallest_gap`.

**⚠️ Common Mistakes**

- Forgetting to sort the work sessions by start time before finding gaps.
- Not correctly converting the time from 24-hour format to minutes.
- Assuming the smallest gap should be a positive number; if sessions are continuous, the gap can be zero.

I-mplement

def convert_to_minutes(time):
    hours = time // 100
    minutes = time % 100
    return hours * 60 + minutes

def find_smallest_gap(work_sessions):
    # Sort the work sessions based on start times
    work_sessions.sort()

    smallest_gap = float('inf')

    for i in range(1, len(work_sessions)):
        # Calculate the end time of the previous session and the start time of the current session
        end_time_prev = convert_to_minutes(work_sessions[i-1][1])
        start_time_curr = convert_to_minutes(work_sessions[i][0])

        # Calculate the gap between the end of the previous session and the start of the current session
        gap = start_time_curr - end_time_prev

        # Update the smallest gap found
        if gap < smallest_gap:
            smallest_gap = gap

    return smallest_gap
Example Usage:

work_sessions = [(900, 1100), (1300, 1500), (1600, 1800)]
print(find_smallest_gap(work_sessions))  # Output: 60

work_sessions_2 = [(1000, 1130), (1200, 1300), (1400, 1500)]
print(find_smallest_gap(work_sessions_2))  # Output: 30

work_sessions_3 = [(900, 1100), (1115, 1300), (1315, 1500)]
print(find_smallest_gap(work_sessions_3))  # Output: 15