-
-
Save moui72/e8697b80c856000e5948cd951dbbc799 to your computer and use it in GitHub Desktop.
HiCal interviewcake question
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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