Manage Performance Stage Changes - codepath/compsci_guides GitHub Wiki
TIP102 Unit 3 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 input to the problem?
- A: The input is a list
changes
of strings where each string represents a change action on the performance schedule.
- A: The input is a list
- Q: What is the output?
- A: The output is a list of performance IDs that remain scheduled on the stage after all changes have been applied.
- Q: What actions can be performed?
- A: The actions include
"Schedule X"
, which schedules a performance,"Cancel"
, which cancels the most recent unscheduled performance, and"Reschedule"
, which reschedules the most recently canceled performance.
- A: The actions include
P-lan
Plan the solution with appropriate visualizations and pseudocode.
General Idea: Use two stacks to manage the scheduled and canceled performances. The main stack (stack
) tracks scheduled performances, while the canceled
stack keeps track of canceled performances that might be rescheduled.
1. Initialize an empty stack `stack` to keep track of scheduled performances.
2. Initialize an empty stack `canceled` to keep track of canceled performances.
3. Iterate through each change action in the `changes` list:
1. If the action starts with `"Schedule"`, extract the performance ID and push it onto `stack`.
2. If the action is `"Cancel"` and `stack` is not empty, pop the top performance from `stack` and push it onto `canceled`.
3. If the action is `"Reschedule"` and `canceled` is not empty, pop the top performance from `canceled` and push it back onto `stack`.
4. After processing all changes, return the contents of `stack` as the list of scheduled performances.
⚠️ Common Mistakes
- Forgetting to handle the case where
"Cancel"
or"Reschedule"
is called when there are no performances to cancel or reschedule. - Not correctly managing the relationship between the
stack
andcanceled
stacks. - Overlooking edge cases such as when all performances are canceled or when no rescheduling is done.
I-mplement
def manage_stage_changes(changes):
stack = []
canceled = []
for change in changes:
if change.startswith("Schedule"):
_, performance_id = change.split()
stack.append(performance_id)
elif change == "Cancel" and stack:
canceled.append(stack.pop())
elif change == "Reschedule" and canceled:
stack.append(canceled.pop())
return stack
# Example usage
print(manage_stage_changes(["Schedule A", "Schedule B", "Cancel", "Schedule C", "Reschedule", "Schedule D"]))
# Output: ["A", "C", "B", "D"]
print(manage_stage_changes(["Schedule A", "Cancel", "Schedule B", "Cancel", "Reschedule", "Cancel"]))
# Output: []
print(manage_stage_changes(["Schedule X", "Schedule Y", "Cancel", "Cancel", "Schedule Z"]))
# Output: ["Z"]