AppointmentBook is #1 from the from the 2023 AP Computer Science A Free Response problems.

https://apcentral.collegeboard.org/media/pdf/ap23-frq-comp-sci-a.pdf

Part (a) findFreeBlock method (original solution)

public int findFreeBlock(int period, int duration)
{
    for(int startMinute = 0; startMinute <= 59; startMinute++)
    {
        int endMinute = startMinute + duration - 1;
        
        if(endMinute > 59)
            return -1;
        
        boolean isFree = true;
        
        for(int minute = startMinute; minute <= endMinute; minute++)
            if( ! isMinuteFree(period, minute) )
                isFree = false;
        
        if(isFree)
            return startMinute;
    }
    
    return -1;
}

This could be done in a few ways.

The condition endMinute > 59 could be incorporated into the loop. I wrote it this way because it very clearly works.

Some of the code inside the outer loop could be extracted into its own method.

Part (a) findFreeBlock method (considered solution)

public int findFreeBlock(int period, int duration)
{
    int freeInARow = 0;
    
    for(int minute = 0; minute <= 59; minute++)
    {
        if(isMinuteFree(period, minute))
            freeInARow++;
        else
            freeInARow = 0;
        
        if(freeInARow == duration)
            return minute - freeInARow + 1;
    }
    
    return -1;
}

This is a one pass algorithm that keeps track of the number of consecutive free minutes. If at any point, the number of consecutive free minutes equals the requested appointment duration, the start of the current run of free minutes is calculated and returned.

When I did this problem the first time, I was aware that there was a better solution, but it was not immediately obvious. My original solution above is what I wrote under time constraints, because I knew it would work.

The start of the current run could also be stored to avoid the calculation minute - freeInARow + 1.

Part (b) makeAppointment method

public boolean makeAppointment(int startPeriod, int endPeriod,
                               int duration)
{
    for(int period = startPeriod; period <= endPeriod; period++)
    {
        int startMinute = findFreeBlock(period, duration);
        
        if(startMinute != -1)
        {
            reserveBlock(period, startMinute, duration);
            return true;
        }
    }
    
    return false;
}

Java files with test code

AppointmentBook.java includes implementations of isMinuteFree and reserveBlock. OneTest.java includes JUnit 5 test code with the examples from the problem. See Running JUnit 5 tests.

AppointmentBook.java
OneTest.java

2023 AP CS Exam Free Response Solutions

Help & comments

Get help from AP CS Tutor Brandon Horn

Comment on AppointmentBook