美文网首页
手写JS面试题-10道(二)

手写JS面试题-10道(二)

作者: 小二儿上酒 | 来源:发表于2021-06-23 09:38 被阅读0次

是什么

通常面试的时候,面试官会提一些JS手写的面试题,主要是为了考察面试者JS 基础的掌握程度。

以下是整理收集的手写面试题,方便大家学习与巩固 JS 基础知识

实现类数组转化为数组

const arrayLike=document.querySelectorAll('div')

// 1.扩展运算符
[...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)

实现模板字符串解析功能

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

实现列表转成树形结构

const list = [
  {
    id: 1,
    text: '节点1',
    parentId: 0 //这里用0表示为顶级节点
  },
  {
    id: 2,
    text: '节点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))

实现树形结构转成列表

const list = [
  {
    id: 1,
    text: '节点1',
    parentId: 0,
    children: [
      {
        id: 2,
        text: '节点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))

冒泡排序--时间复杂度 n^2

function bubbleSort(arr) {
  // 缓存数组长度
  const len = arr.length;
  // 外层循环用于控制从头到尾的比较+交换到底有多少轮
  for (let i = 0; i < len; i++) {
    // 内层循环用于完成每一轮遍历过程中的重复比较+交换
    for (let j = 0; j < len - 1; j++) {
      // 若相邻元素前面的数比后面的大
      if (arr[j] > arr[j + 1]) {
        // 交换两者
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  // 返回数组
  return arr;
}
// console.log(bubbleSort([3, 6, 2, 4, 1]));

选择排序--时间复杂度 n^2

function selectSort(arr) {
  // 缓存数组长度
  const len = arr.length;
  // 定义 minIndex,缓存当前区间最小值的索引,注意是索引
  let minIndex;
  // i 是当前排序区间的起点
  for (let i = 0; i < len - 1; i++) {
    // 初始化 minIndex 为当前区间第一个元素
    minIndex = i;
    // i、j分别定义当前区间的上下界,i是左边界,j是右边界
    for (let j = i; j < len; j++) {
      // 若 j 处的数据项比当前最小值还要小,则更新最小值索引为 j
      if (arr[j] < arr[minIndex]) {
        minIndex = j;
      }
    }
    // 如果 minIndex 对应元素不是目前的头部元素,则交换两者
    if (minIndex !== i) {
      [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
    }
  }
  return arr;
}
// console.log(quickSort([3, 6, 2, 4, 1]));

插入排序--时间复杂度 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]));

快排--时间复杂度 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]));

归并排序--时间复杂度 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]));

二分查找--时间复杂度 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(`目标元素在数组中的位置:${position}`);
// } else {
//   console.log("目标元素不在数组中");
// }

相关文章

  • 手写JS面试题-10道(二)

    是什么 通常面试的时候,面试官会提一些JS手写的面试题,主要是为了考察面试者JS 基础的掌握程度。 以下是整理收集...

  • 手写JS面试题-10道(一)

    是什么 通常面试的时候,面试官会提一些JS手写的面试题,主要是为了考察面试者JS 基础的掌握程度。 以下是整理收集...

  • 十道前端面试题第【03】篇

    摘要:本篇分享了10道面试题——Web性能优化方案、JS严格模式、五道算法题、自定义JS事件系统、输入URL到浏览...

  • js基础面试题

    面试题:延迟加载JS有哪些方式? 面试题:JS数据类型有哪些? 面试题:JS数据类型考题 考题一: 考题二: 面试...

  • 十道前端面试题第【04】篇

    摘要:本篇分享了10道面试题——四道算法题、判断两个对象是否相等、JS数组模拟队列、SSR服务端渲染、封装WebS...

  • 面试

    来深圳面试的第二天,真的涨经验了,第一次就一道JS题,其他全是HTML css。 第二次也是一道JS面试题,其他v...

  • 来两个面试计算题

    看到两道面试题,随手写了一来 第一题:采用循环语句输出下面图形 swift版本答案: 输出结果: oc版本: 第二...

  • 面试.md

    [TOC] 2017年第一波 JavaScript 面试题 一道常被人轻视的前端****JS面试题 目录 前言 第...

  • 由一道面试题到 valueOf 方法的原理

    一道面试题 最近看到一道面试题 add(4)(2, 3)(10) // 得到结果 20 本以为用 argument...

  • 多个异步请求同时发出,对其结果进行有序执行~

    这是一道面试时遇到的面试题,当时没手写出来,现在抽空敲出来了,补一下~原题是这样的: 有10个ajax请求,要求同...

网友评论

      本文标题:手写JS面试题-10道(二)

      本文链接:https://www.haomeiwen.com/subject/tdyyyltx.html