绿色、免费的各种工具分享给你

所在位置:主页 > 学习教程 > 题库 > 算法 >
前端算法面试题及答案解析

前端算法面试题及答案解析

类型: 算法 时间: 2025-05-06 版本: v1.0 大小: 2.92M 语言:简体中文

内容介绍

详情简介

算法面试题目大全提供十分全面的各类算法讲解,从时间复杂度到空间复杂度,再到最常用的各类算法,为你带来详细的介绍,面对算法面试题再也不用慌了。

算法列举

1.数组去重方法
const u'niqueArr = [...new Set(arr)]
Const uniqueArr = arr.filter((item,index)=>arr.indexOf() === index)
Const uniqueArr = arr.reduce((accept,item)=>arr.includes(item)?accept:[item,...accept],[])
const arr = [{key:1,value:1},{key:1,value:2}]
Const keyMap = new Map()
Arr.forEach(item=>{
   If(!keyMap.has(item.key)){
     KeyMap.set(item.key,item)
     uniqueArr.push(item)
}
})
第三方库 uniqBy(arr,’key’)
2.数组扁平化
Arr.flat(Infinity)
Const arr = [1,[2,[3]]]
Cosnt flatFn=(arr) =>arr.reduce((accept,item=>Array.isArray(item)?[...accept,...flatFn(item)]:[item,...accept])) 
[1,[2,[3]]].toString().split(‘,’).map(Number)
3.求Dom树节点深度
GetVNodeDepth = (vNode) => {
   If(!vNode.children || vNode.children.length <=0) return 1
   Const childrenDepths = [...vNode.children].map(getVNodeDepth)
   Return 1 + Math.max(...childrenDepths)
}
4.快速排序
Const quickSort = (arr) =>{
   If(arr.length<=1) return arr
   Const template = arr[0]
   Const leftArr = []
   Const rightArr = []
   For(let i= 1;i<arr.length;i++){
   arr[i]<template?leftArr.push(arr[i]):rightArr(arr[i])
}
Return [...quickSort(leftArr),template,,...quickSort(rightArr)]
}
5.冒泡排序
BubbleSort = (arr) =>{
  For(let i = 0 ;i<arr.length-1;i++){
   For(let j=0;j<arr.length-1-i;j++){
       If(arr[j]>arr[j+1]){
        [arr[j],arr[j+1]] = [arr[j+1],arr[j]]
}
}
}
}
6.diff算法
为什么会触发diff算法:
React的diff算法,当setState更新数据后,会将组件标记为待更新“dirty”,并进行一次重新渲染,这不是立即执行,还是加入到更新队列等待react调度机制处理;
渲染时
会调用组件的render函数生成全量的新的虚拟dom树,生成完成虚拟dom树比直接操作DOM成本低,节省性能。
此时有旧虚拟dom和新虚拟dom,通过diff算法,
当旧头<=旧尾 且 新头<=新尾 时,
进行旧头,旧尾;新头,新尾比较,如果sameVnode比较后相同,就用pathVnode,更新节点的文本,以及attr,也就是plachhodler等属性,event事件,如onClick,onChange等,class,也就是className上的类,props,也就是写在dom结构上传递的数据,以及style;再通过找到当前节点的新旧节点children,子节点集合,如果子节点都为真,再次递归调用diff算法,将当前节点,和新旧子节点作为参数传入,如果只有新子节点为真,添加新子节点;如果只有旧子节点为真,删除旧子节点。
新尾;新头,旧尾比较;如果相同,就将新节点的元素通过父节点的beforeInset方法插入;
如果这些都不匹配,就用key值创建出旧节点的映射表,查找新节点的key值在映射表中的位置,如果找到,就patchNode局部更新变化的地方,插入到对应的旧节点之前。
如果出现旧头startIndex大于旧尾endIndex,表示还有新节点,通过CreateElement创建新节点元素,通过insetBefore插入父元素中;
如果出现新头startIndex大于新尾endIndex,表示还有旧节点指针在比较,遍历此时的oldStartIndex和oldEndIndex指针对于的旧节点,通过父节点的removeChild方法移除节点。

题目列表

1.说说你对数据结构的理解,有哪些,区别?
2.说说你对算法的理解,应用场景?
3.说说你对算法中时间复杂度,空间复杂度的理解,如何计算?
4.说说你对集合的理解?常见的操作有哪些?
5.说说你对树的理解?相关的操作有哪些?
6.你对栈,队列的理解,应用场景?
7.你对链表的理解,常见的操作有哪些?
8.说说你对堆的理解?如何实现?应用场景?
9.说说你对图的理解?相关操作有哪些?
10.说说常见的排序算法有哪些?区别?
免费绿色
展开
  • 游戏热度榜
  • 软件热度榜