1. 程式人生 > 實用技巧 >區間合併 面試題

區間合併 面試題

線上面試 開著攝像頭 一進去面試的是一個小姐姐 很耐心的講解題目要考哪些 然後說兩個問題 時間是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 }]

時間比較緊,有好的方式大佬們貼出來哈;