区间合并 面试题

线上面试 开着摄像头 一进去面试的是一个小姐姐 很耐心的讲解题目要考哪些 然后说两个问题 时间是20分钟 然后就开始;

 

 

HR在给候选人安排面试时,需要参考面试官的日程和偏好,比如几点到几点面试官要开会,几点到几点面试官要吃饭。为了便于查看,系统会自动将面试官的所有不可用时间段进行合并展示。

现在定义区间的数据格式如下:

/**
 * @typedef Range 
 * @property {number} start - 区间的开始时间
 * @property {number} end - 代表区间的结束时间
 */
第一问

任意给定两个区间,写一个函数isOverlapped判断这两个区间是否有重叠(不存在非法数据,区间都是闭区间)。

/**
 * @param {Range} first - 第一个区间
 * @param {Range} second - 第二个区间
 * @return {boolean} 是否重叠
 */
function isOverlapped(first, second) {
  // TODO
  if(first.start<second.end&&first.end>second.start){
    return true;
  }else{
    return false;
  }
}

// test case
const a = { start: 3, end: 5 };
const b = { start: 4, end: 6 };
const c = { start: 7, end: 8 };

isOverlapped(a, b); // true
isOverlapped(b, c); // false
第二问

定义区间的合并操作是:如果两个区间是重叠的,取两个区间的最小start作为合并后区间的start,最大end作为合并后区间的end,合并后的区间会替换掉原来的两个区间。如果两个区间没有重叠,则保持原状。

现在给定任意个区间,写一个函数merge对这些区间进行合并操作,直到无法继续合并为止,输出结果。

/**
 * @param {Range[]} intervals - 若干个区间
 * @return {Range[]} 合并后的区间
 */
function merge(intervals) {
  // TODO
 let temp = [];
  for(var i=0;i<intervals.length;i++;){
    for(var j=i+1;j<intervals.length;j++;){
      if(i.start<j.end&&i.end>j.start){
        temp.push({
          start:i.start,
          end:j.end
        })
      }else{
        temp.push(i);
      }
    }
    return temp;
  }
}

// test case
const a = { start: 3, end: 5 };
const b = { start: 4, end: 6 };
const c = { start: 7, end: 8 };

merge([a, b, c]); // [{ start: 3, end: 6 }, { start: 7, end: 8 }]

时间比较紧,有好的方式大佬们贴出来哈;

原文地址:https://www.cnblogs.com/yangsg/p/13602455.html