手寫JS面試題-10道(二)

是什么

通常面試的時候,面試官會提一些JS手寫的面試題晌梨,主要是為了考察面試者JS 基礎(chǔ)的掌握程度须妻。

以下是整理收集的手寫面試題,方便大家學(xué)習(xí)與鞏固 JS 基礎(chǔ)知識

實現(xiàn)類數(shù)組轉(zhuǎn)化為數(shù)組

const arrayLike=document.querySelectorAll('div')

// 1.擴(kuò)展運算符
[...arrayLike]
// 2.Array.from
Array.from(arrayLike)
// 3.Array.prototype.slice
Array.prototype.slice.call(arrayLike)
// 4.Array.apply
Array.apply(null, arrayLike)
// 5.Array.prototype.concat
Array.prototype.concat.apply([], arrayLike)

實現(xiàn)模板字符串解析功能

let template = '我是{{name}}掌逛,年齡{{age}}司倚,性別{{sex}}'
let data = {
  name: '姓名',
  age: 18
}

function render (template, data) {
  let computed = template.replace(/\{\{(\w+)\}\}/g, function (match, key) {
    return data[key]
  })
  return computed
}

console.log(render(template, data)) // 我是姓名动知,年齡18,性別undefined

實現(xiàn)列表轉(zhuǎn)成樹形結(jié)構(gòu)

const list = [
  {
    id: 1,
    text: '節(jié)點1',
    parentId: 0 //這里用0表示為頂級節(jié)點
  },
  {
    id: 2,
    text: '節(jié)點1_1',
    parentId: 1 //通過這個字段來確定子父級
  }
]
function listToTree (data) {
  let temp = {}
  let treeData = []
  for (let index = 0; index < data.length; index++) {
    const element = data[index]
    temp[data[index]['id']] = element
  }
  for (let i in temp) {
    if (+temp[i].parentId != 0) {
      if (!temp[temp[i].parentId].children) {
        temp[temp[i].parentId].children = []
      }
      temp[temp[i].parentId].children.push(temp[i])
    } else {
      treeData.push(temp[i])
    }
  }
  return treeData
}

console.log(listToTree(list))

實現(xiàn)樹形結(jié)構(gòu)轉(zhuǎn)成列表

const list = [
  {
    id: 1,
    text: '節(jié)點1',
    parentId: 0,
    children: [
      {
        id: 2,
        text: '節(jié)點1_1',
        parentId: 1
      }
    ]
  }
]
function treeToList (data) {
  let res = []
  const dfs = tree => {
    tree.forEach(item => {
      if (item.children) {
        dfs(item.children)
        delete item.children
      }
      res.push(item)
    })
  }
  dfs(data)
  return res
}

console.log(treeToList(list))

冒泡排序--時間復(fù)雜度 n^2

function bubbleSort(arr) {
  // 緩存數(shù)組長度
  const len = arr.length;
  // 外層循環(huán)用于控制從頭到尾的比較+交換到底有多少輪
  for (let i = 0; i < len; i++) {
    // 內(nèi)層循環(huán)用于完成每一輪遍歷過程中的重復(fù)比較+交換
    for (let j = 0; j < len - 1; j++) {
      // 若相鄰元素前面的數(shù)比后面的大
      if (arr[j] > arr[j + 1]) {
        // 交換兩者
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  // 返回數(shù)組
  return arr;
}
// console.log(bubbleSort([3, 6, 2, 4, 1]));

選擇排序--時間復(fù)雜度 n^2

function selectSort(arr) {
  // 緩存數(shù)組長度
  const len = arr.length;
  // 定義 minIndex,緩存當(dāng)前區(qū)間最小值的索引丹皱,注意是索引
  let minIndex;
  // i 是當(dāng)前排序區(qū)間的起點
  for (let i = 0; i < len - 1; i++) {
    // 初始化 minIndex 為當(dāng)前區(qū)間第一個元素
    minIndex = i;
    // i摊崭、j分別定義當(dāng)前區(qū)間的上下界,i是左邊界呢簸,j是右邊界
    for (let j = i; j < len; j++) {
      // 若 j 處的數(shù)據(jù)項比當(dāng)前最小值還要小,則更新最小值索引為 j
      if (arr[j] < arr[minIndex]) {
        minIndex = j;
      }
    }
    // 如果 minIndex 對應(yīng)元素不是目前的頭部元素根时,則交換兩者
    if (minIndex !== i) {
      [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
    }
  }
  return arr;
}
// console.log(quickSort([3, 6, 2, 4, 1]));

插入排序--時間復(fù)雜度 n^2

function insertSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    let j = i;
    let target = arr[j];
    while (j > 0 && arr[j - 1] > target) {
      arr[j] = arr[j - 1];
      j--;
    }
    arr[j] = target;
  }
  return arr;
}
// console.log(insertSort([3, 6, 2, 4, 1]));

快排--時間復(fù)雜度 nlogn~ n^2 之間

function quickSort(arr) {
  if (arr.length < 2) {
    return arr;
  }
  const cur = arr[arr.length - 1];
  const left = arr.filter((v, i) => v <= cur && i !== arr.length - 1);
  const right = arr.filter((v) => v > cur);
  return [...quickSort(left), cur, ...quickSort(right)];
}
// console.log(quickSort([3, 6, 2, 4, 1]));

歸并排序--時間復(fù)雜度 nlog(n)

function merge(left, right) {
  let res = [];
  let i = 0;
  let j = 0;
  while (i < left.length && j < right.length) {
    if (left[i] < right[j]) {
      res.push(left[i]);
      i++;
    } else {
      res.push(right[j]);
      j++;
    }
  }
  if (i < left.length) {
    res.push(...left.slice(i));
  } else {
    res.push(...right.slice(j));
  }
  return res;
}

function mergeSort(arr) {
  if (arr.length < 2) {
    return arr;
  }
  const mid = Math.floor(arr.length / 2);

  const left = mergeSort(arr.slice(0, mid));
  const right = mergeSort(arr.slice(mid));
  return merge(left, right);
}
// console.log(mergeSort([3, 6, 2, 4, 1]));

二分查找--時間復(fù)雜度 log2(n)

function search(arr, target, start, end) {
  let targetIndex = -1;

  let mid = Math.floor((start + end) / 2);

  if (arr[mid] === target) {
    targetIndex = mid;
    return targetIndex;
  }

  if (start >= end) {
    return targetIndex;
  }

  if (arr[mid] < target) {
    return search(arr, target, mid + 1, end);
  } else {
    return search(arr, target, start, mid - 1);
  }
}
// const dataArr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
// const position = search(dataArr, 6, 0, dataArr.length - 1);
// if (position !== -1) {
//   console.log(`目標(biāo)元素在數(shù)組中的位置:${position}`);
// } else {
//   console.log("目標(biāo)元素不在數(shù)組中");
// }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蝉娜,隨后出現(xiàn)的幾起案子扎唾,更是在濱河造成了極大的恐慌,老刑警劉巖胸遇,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荧呐,死亡現(xiàn)場離奇詭異,居然都是意外死亡纸镊,警方通過查閱死者的電腦和手機(jī)倍阐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逗威,“玉大人峰搪,你說我怎么就攤上這事】瘢” “怎么了概耻?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長罐呼。 經(jīng)常有香客問我鞠柄,道長,這世上最難降的妖魔是什么嫉柴? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮匙握,結(jié)果婚禮上肺孤,老公的妹妹穿的比我還像新娘赠堵。我一直安慰自己,他們只是感情好揍愁,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布谬擦。 她就那樣靜靜地躺著惨远,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贺氓。 梳的紋絲不亂的頭發(fā)上辙培,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音厨相,去河邊找鬼。 笑死践磅,一個胖子當(dāng)著我的面吹牛府适,可吹牛的內(nèi)容都是我干的檐春。 我是一名探鬼主播疟暖,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼擎鸠!你這毒婦竟也來了糠亩?” 一聲冷哼從身側(cè)響起廷没,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤另锋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后室梅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡间涵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年思劳,在試婚紗的時候發(fā)現(xiàn)自己被綠了敢艰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片震嫉。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悴势,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捧存,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布吗货,位于F島的核電站宙搬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窥摄。R本人自食惡果不足惜崭放,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一决摧、第九天 我趴在偏房一處隱蔽的房頂上張望边锁。 院中可真熱鬧,春花似錦贡蓖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至候衍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背他膳。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工蟀俊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留职抡,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓郊丛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親揍瑟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容