Skip to content

Instantly share code, notes, and snippets.

@moui72
Last active December 4, 2019 23:51
Show Gist options
  • Save moui72/e8697b80c856000e5948cd951dbbc799 to your computer and use it in GitHub Desktop.
Save moui72/e8697b80c856000e5948cd951dbbc799 to your computer and use it in GitHub Desktop.
HiCal interviewcake question
const merger = meetings => {
// initialize merged blocks with first meeting
let merged = [meetings[0]];
for (let mtg = 1; mtg < meetings.length; mtg++) {
// iterate over each other meeting once
// otherwise, look for collision btwn current mtg and existing time blocks
let collisionIndex = -1;
for(let i = 0; i < merged.length; i++){
// iterate over each existing merged block
if (
meetings[mtg].startTime <= merged[i].endTime &&
meetings[mtg].endTime >= merged[i].startTime
){
// Collision between mtg and block!
// Expand block: start at the earlier of mtg's startTime or block's startTime
merged[i].startTime = Math.min(merged[i].startTime, meetings[mtg].startTime);
// Expand block: end at the later of mtg's endTime or block's endTime
merged[i].endTime = Math.max(merged[i].endTime, meetings[mtg].endTime);
if(collisionIndex < 0) {
// track where collision was in case of future collisions
collisionIndex = i;
} else {
/*
this is not the first block this meeting has colided with! That means merged[i] collides with merged[collisionIndex], so...
-- expand merged[collisionIndex]
-- and merged.pop() to discard merged[i]
*/
merged[collisionIndex].startTime = Math.min(merged[i].startTime, merged[collisionIndex].startTime);
merged[collisionIndex].endTime = Math.max(merged[i].endTime, merged[collisionIndex].endTime);
merged.pop()
}
}
}
if(collisionIndex < 0) {
// this meeting never colided, so it becomes a new block
merged.push(meetings[mtg])
}
}
return merged
}
const test = (arr) => {
console.log("Testing...")
console.log(arr)
const mergedMeetings = merger(arr)
console.log("final result:")
console.log(mergedMeetings)
}
test([
{ startTime: 0, endTime: 1 },
{ startTime: 3, endTime: 5 },
{ startTime: 4, endTime: 8 },
{ startTime: 10, endTime: 12 },
{ startTime: 9, endTime: 10 },
]);
test([
{ startTime: 0, endTime: 1 },
{ startTime: 3, endTime: 5 },
{ startTime: 4, endTime: 8 },
{ startTime: 10, endTime: 12 },
{ startTime: 9, endTime: 10 },
{ startTime: 8, endTime: 9 }
]);
/*
Your company built an in-house calendar tool called HiCal. You want to add a feature to see the times in a day when everyone is
available.
To do this, you’ll need to know when any team is having a meeting. In HiCal, meetings are stored as objects with integer
properties startTime and endTime. These integers represent the number of 30-minute blocks past 9:00am.
For example:
{ startTime: 2, endTime: 3 } // meeting from 10:00 – 10:30 am
{ startTime: 6, endTime: 9 } // meeting from 12:00 – 1:30 pm
Write a function mergeRanges() that takes an array of multiple meeting time ranges and returns an array of condensed ranges.
For example, given:
[
{ startTime: 0, endTime: 1 },
{ startTime: 3, endTime: 5 },
{ startTime: 4, endTime: 8 },
{ startTime: 10, endTime: 12 },
{ startTime: 9, endTime: 10 },
]
your function would return:
[
{ startTime: 0, endTime: 1 },
{ startTime: 3, endTime: 8 },
{ startTime: 9, endTime: 12 },
]
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment