4 ms·
The most logical and clear answer for me (assuming I didn't already screw up by making assumptions about the data format, problem definition, etc.) is: 1. Figu
by FT_intern 9y ago
The most logical and clear answer for me (assuming I didn't already screw up by making assumptions about the data format, problem definition, etc.) is:
1. Figure out which appointment starts first
2. Check if first_appointment.end > second_appointment.start
So:
boolean AreAppointmentsConflicting(int start1, int start2, int end1, int end2) {
// first and second refer to the start time of the appointments.
// The first appointment is the one with the earlier start time.
int first_appointment_end, second_appointment_start;
if (start1 > start2) {
first_appointment_end = end2;
second_appointment_start = start1;
} else if (start1 < start2) {
first_appointment_end = end1;
second_appointment_start = start2;
} else { // same start time
return true;
}
return first_appointment_end > second_appointment_start;
}
That can be shortened to:
return (start1 > start2 && end2 > start1) || (start1 < start2 && end1 > start2) || start1 == start2;
Or shortened even further in https://news.ycombinator.com/item?id=14641485 https://news.ycombinator.com/item?id=14641485
The third answer would get massive upvotes for brevity on LeetCode. The first answer would be preferable for readability in an actual code base.
- Stratoscope 9y agoPersonally I find the first version a bit hard to follow, and the second one makes my head spin. But I can understand the objection to the third version too. I don't think the problem is that the expression is too simple - simplicity is generally a good thing! - but that it's easier to reason about non-conflicting times instead of conflicting times: If my other meeting ends by the time this one starts, we're good. Or if this meeting ends by the time the other one starts, we're good. Otherwise we have a conflict. So now if you like the step-by-step approach, we can write a function that seems pretty straightforward and easy to understand: boolean AreTimesCompatible( TimeRange thisRange, TimeRange thatRange ) { if( thatRange.end <= thisRange.start ) { return true; // that one ends by the time this one starts } if( thisRange.end <= thatRange.start ) { return true; // this one ends by the time that one starts } return false; // they overlap } I think it reads fine as a single expression too, given an appropriate comment explaining the idea (which you'd want anyway): // Time ranges are compatible if that one ends by the time this one // starts, or if this one ends by the time that one starts. // Otherwise they overlap. boolean AreTimesCompatible( TimeRange thisRange, TimeRange thatRange ) { return thatRange.end <= thisRange.start || thisRange.end <= thatRange.start; } And here is the matching function to go with either of those: boolean AreTimesConflicting( TimeRange thisRange, TimeRange thatRange ) { return ! AreTimesCompatible( thisRange, thatRange ); }