Drill

ProblemsJavaScript › dates

Merge overlapping bookings

harddatesJavaScript

A room calendar shows one bar per stretch of occupied time, so bookings that overlap or run straight into each other have to be folded together first.

mergeSpans(spans: list<Span>) → list<Span>

Solve it in the editor →

Where you start

function mergeSpans(spans) {
  
}

Worked examples

CallResult
mergeSpans([{"start":1,"finish":3},{"start":2,"finish":6},{"start":8,"finish":10}])[{"start":1,"finish":6},{"start":8,"finish":10}]
mergeSpans([{"start":5,"finish":6},{"start":1,"finish":3}])[{"start":1,"finish":3},{"start":5,"finish":6}]
mergeSpans([{"start":1,"finish":4},{"start":4,"finish":5}])[{"start":1,"finish":5}]
mergeSpans([{"start":1,"finish":10},{"start":2,"finish":3}])[{"start":1,"finish":10}]

Hint

Sort by start, then sweep: either the next one extends the current stretch, or it begins a new one.

Reference solution in JavaScript
function mergeSpans(spans) {
  const live = spans.filter((s) => s.finish > s.start).sort((a, b) => a.start - b.start);
  const result = [];
  for (const s of live) {
    const last = result[result.length - 1];
    if (last && s.start <= last.finish) last.finish = Math.max(last.finish, s.finish);
    else result.push({ start: s.start, finish: s.finish });
  }
  return result;
}

The same problem in another language

More dates problems in JavaScript