前端面试 --数据结构与算法篇
一. 各种数据结构汇总
(内容深度只涉及到前端水平,毕竟我水平也一般)
1. 线性表
数据元素间是线性关系,数据元素在表中的位置只取决于 其序号
存在唯一的一个被称作“第一个”的数据元素和唯一的一 个被称作“最后一个”的数据元素
除第一个外,每个数据元素均只有一个前驱;除最后一个 外,每个数据元素均只有一个后继
(1)单链表
分为两种
第一种是 头指针指向首元节点,该节点和其他节点没有区别。每一个节点的next指针指向下一个节点。
第二种是头指针指向头节点,再指向首元节点。目的就是为了在头部添加数据时不需要对头指针进行特殊处理。(简单来讲,添加元素就是在对应索引节点的next指针后指向该新加的元素,并且让新加的元素next指向对应索引+1的节点,但是处理头部添加不同,因为对于第一种链表头指针没有next,但是对于第二种就可以一视同仁)。
两种单链表判空的方式也不同,
第一种就是first=> null
第二种就是first=>节点内容为null
(2)单循环列表
应该很好理解,就是尾部next又指到了头部
单循环链表是单链表的变形。
单循环链表最后一个结点的后继指针不为 0 (NULL),而是指向了表的前端。
为简化操作,在单循环链表中往往加入表头结点。
单循环链表的特点是:只要知道表中某一结点的 地址,就可搜寻到所有其他结点的地址。
(3)双向链表
也很好理解,每个节点不仅有next,还有prev指向前一个节点。
2. 栈与队列
(1)栈 (核心就是先入后出)
先入的在栈底,先出的在栈顶。
js的执行调用就是用的栈,对非引用类型的数据存储也是用的栈。一个栈独占一组地址连续的存储单元。通常0下标端设为栈底,栈顶指针top值为-1,表示空栈。
进栈
出栈
细节就是top指针会在入栈时先加后入,在出栈时先减后出。
一个简单计算题(建议直接背)
n个元素依次入栈,可得到多少个合法的出栈序列 (2n)!/[(n+1)!*n! ]
(2)链栈
栈的应用在编码过程中最主要的就是递归。递归就不详细解释了(函数调用其本身,但是需要合适的中止条件)。
(3)队列(核心就是先排先到,先进先出)
进队和出队
判空 q−>front=q−>rear
(4)链队列
3. 树的结构及基本操作(基本一问数据结构就爱问这玩意)
定义:
树是由n(n≥0)个结点组成的有限集合T,非空树满足: 1)有一个称之为根(root)的结点。 2)除根以外的其余结点被分成m(0≤m
术语:
结点的度 结点拥有的子树数目。
叶子(终端)结点 度为0的结点。
分支(非终端)结点 度不为0的结点。
树的度 树的各结点度的最大值。
内部结点 除根结点之外的分支结点。
双亲与孩子(父与子)结点 结点的子树的根称为该 结点的孩子;该结点称为孩子的双亲。
兄弟 属于同一双亲的孩子。
结点的祖先 从根到该结点所经分支上的所有结点。
结点的子孙 该结点为根的子树中的任一结点。
结点的层次 表示该结点在树中的相对位置。根为 第一层,其它的结点依次下推;若某结点在第L层 上,则其孩子在第L+1层上。
堂兄弟 双亲在同一层的结点互为堂兄弟。
树的深(高)度 树中结点的最大层次。
有序树 树中各结点的子树从左至右是有次序的, 不能互换。否则,称为无序树。
路径长度 从树中某结点Ni 出发,能够“自上而下 地”通过树中结点到达结点Nj ,则称Ni 到Nj 存在一 条路径,路径长度等于这两个结点之间的分支数。
树的路径长度 从根到每个结点的路径长度之和。
森林 是m(m≥0)棵互不相交的树的集合。
(1) 二叉树的定义与性质
二叉树的定义
二叉树是n(n≥0)个结点的有限集合,它或为 空树(n=0),或由一个根结点和两棵互不相交的左子树和 右子树的二叉树组成。
二叉树的遍历方法(常考)
简单概括:先序(先根) 根 左 右
中序(中根) 左 根 右
后序(后根) 根 左 右
层遍历 一层一层读就行
二叉树的先序、中序、后序遍历超详解_代码敲上天...的博客-CSDN博客_二叉树的先序,中序,后序遍历
(2)哈夫曼树
构造方式
这个解释一下,其实也不难。首先需要找到两个最小权值。min1.min2分别作为左右节点。然后在原本的数组中去掉这俩值,再找两个最小的min3.min4,组成另一棵树的左右节点。(注意每次使用完一个权值后就从数组中删掉,后面也是)。然后开始分别操作这两棵树 A,B(就是a做了什么,b跟着做一下什么)。找最小值min5,当作左节点,而数A根节点当中右节点,形成数A1,B也进行一样的操作,找到最小值min6,作为左节点,与数B的根节点构成新的数B2,依次进行下去,最后两颗树 An和Bn 做为左节点和右节点,形成最终的哈夫曼树。
4.图(因为基本不考面试,就不做总结了,感兴趣可以自己学一下)
5.查找和排序
(1)二分查找(最常考)
只针对有序表。原理如图
前端实现
/*** * @param {Number[]} arr * @param {Number} target */
// 此处以升序表为例 返回目标索引
function HalfSearch(arr, target) {let left = 0let right = arr.lengthlet mid = 0while (left+1!== right) {mid = Math.floor((left + right) / 2)if (arr[mid] < target) {left = mid } else if (arr[mid] > target) {right = mid} else {return mid}}return -1
}
console.log(HalfSearch([1, 5, 8, 22, 34, 56, 90], 22));
时间复杂度O(h)=O(log2n)
(2)哈希表
在记录的存储地址和它的关键字之间建立一个确定的 对应关系;这样,理想状态不经过比较,一次存取就能得 到所查元素。
哈希函数的基本构造方法(也挺常考)
1. 直接定址法
2. 数字分析法/基数转换法
3. 平方取中法
4. 随机数法
5. 折叠法
6. 除留余数法
(素数一般指质数。质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。反正我当时忘了~)
(3)排序
1. 冒泡排序(O(n²))
/*** * @param {Number[]} arr */
function BubbleSort(arr){for(let i=0;i<arr.length;i++){for(let j=i+1;j<arr.length;j++){if(arr[j]<arr[i]){let temp=arr[j]arr[j]=arr[i]arr[i]=temp}}}return arr
}
console.log(BubbleSort([2,5,78,4,1]));
2. 插入排序(O(n²))
/*** * @param {Number[]} arr */
function insertSort(arr) {for (let i = 0; i < arr.length; i++) {let key = arr[i]let j = i - 1while (arr[j] > key && j >= 0) {arr[j + 1] = arr[j]arr[j] = keyj--}}return arr
}
console.log(insertSort([4, 1, 7, 22, 12, 5, 8]));
3. 选择排序(O(n²))
/*** * @param {Number[]} arr */
function selectSort(arr) {let res = []while (arr.length !== 0) {let min = Math.min(...arr)res.push(min)arr.splice(arr.indexOf(min), 1)}return res
}
console.log(selectSort([3,5,87,42,33,23,7]));
4. 快速排序(nlog2n)注意是2的对数不是2*n 不知道咋输入公式这里
一文读懂快速排序
/*** * @param {Number[]} arr */
function quickSort(arr) {if (arr.length === 0) {return arr}let key = arr.shift()let left = []let right = []for (let i = 0; i < arr.length; i++) {if (arr[i] > key) {right.push(arr[i])} else {left.push(arr[i])}}return quickSort(left).concat(key, quickSort(right))
}
console.log(quickSort([12, 4, 67, 33, 22, 10, 4, 3, 1, 5]));
5. 归并排序(nlog2n)注意是2的对数不是2*n 不知道咋输入公式这里
第1趟:将待排序列R[1..n]看作n个长度为1的有序子序列, 两两归并,得到n/2个长度为2的有序子序列(或最后一个 子序列长度为1);
第2趟:将上述n/2个有序子序列两两归并; ...… 直到合并成一个序列为止。
归并排序(JS实现) - 这个少年有点热丶 - 博客园
/*** * @param {Number[]} arr */
function mergeSort(arr) {const merger = (left, right) => {const n = left && left.length;const m = right && right.length;let backs = [];let i = 0;let j = 0;while (i < n && j < m) {if (left[i] < right[j]) {backs.push(left[i++])} else {backs.push(right[j++])}}while (i < n) {backs.push(left[i++])}while (j < m) {backs.push(right[j++])}return backs;}if (arr.length == 1) return arrvar mid = Math.floor(arr.length / 2)var left = arr.slice(0, mid)var right = arr.slice(mid)return merger(mergeSort(left), mergeSort(right))
}
console.log(mergeSort([3, 6, 8, 2, 1, 10]));
一个复杂度汇总:
前端面试 --数据结构与算法篇相关推荐
- 前端面试大全(Ajax篇——面试官这样问,你答得上来吗?)
目录 面试系列 内容介绍 1.Ajax 是什么? 如何创建一个Ajax? ①.Ajax ②.异步 ③.步骤 2.同步和异步的区别? ①.同步 ②.异步 3.如何解决跨域问题? 4.http状态码有那些 ...
- 前端面试大全(序篇)
面试系列 后续更新分类将同步更新系列目录: 前端面试大全(序篇):https://blog.csdn.net/cainiaoyihao_/article/details/116518423 前端面试大 ...
- 携手共筑前端面试宝典之JQUERY篇-王大师
写在前面 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,<Java王大师王天师>作者 公众号:山峯草堂,非技术多篇文章,专注于天道酬勤的 Java 开发问题.中国国学.传 ...
- 前端面试大全(JavaScript篇——面试利器值得拥有!)
目录 面试系列 内容介绍 1.介绍js的基本数据类型. 2.介绍js有哪些内置对象? 3.说几条写JavaScript的基本规范?, 4.JavaScript原型,原型链? 有什么特点? 一.关系 二 ...
- 10w字!前端知识体系+大厂面试总结(算法篇)
内容超肝,慎入! 系列文章(一)(基础知识篇) 作者主页: https://juejin.cn/user/2594503172831208 正文 之前我对算法的理解,仅仅是为了应付大厂的面试 但是在两 ...
- 全面详细的面试指南:数据结构与算法篇 (附答案)
前言 背景:算法与数据结构作为技术开发者最基本的技术修养,在面试中出现的频率非常高 本文目的:花尽可能短的时间,快速学习面试中常见常考的数据结构知识及算法题 适用阅读人群:技术岗位面试开发者 本文主要 ...
- java有趣的技术分享ppt,java面试数据结构与算法高频考
前言 本文涵盖了阿里巴巴.腾讯.字节跳动.京东.华为等大厂的Java面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同 ...
- web前端面试高频考点——JavaScript 篇(一)【JS的三座大山 】 原型和原型链、作用域和闭包、异步
系列文章目录 JavaScript 知识梳理,收录了web前端面试 95%以上 的高频考点,满满的干货.给你做一个高效的知识梳理,为你的面试保驾护航! 内容 参考链接 HTML & CSS 篇 ...
- 前端date format_前端面试-手撕代码篇
前言 在前端面试有一个非常重要的环节,也是面试者最担心的一个环节.对"手撕代码"的考察需要面试者平时总结和积累(临时抱佛脚是不好使的),在这里笔者就自己如何攻破"手撕代码 ...
最新文章
- 输入法项目-用delphi生成GBK 中文编码 表(4~5) GBK/4~5: 0xAA40~0xFEA0(部分) 扩充汉字 包括繁体 0xA840~0xA995(部分) 扩充非汉字...
- 浅析移动端建站周期影响因素有哪些?
- linux mysql数据库优化_MySQL_Linux下MySQL数据库性能调优方法,以下的环境具备一定的代表性 - phpStudy...
- 只用jsp实现同样的Servlet功能
- HTML5协议的,HTML5新增协议:WebSocket协议的实例
- [Leedcode][JAVA][按摩师][动态规划]
- WinForm部署问题
- Hadoop Snappy安装终极教程
- linux安装软件系列之yum安装
- 如何用计算机算幂函数,怎样用计算器算幂指数
- HDU - 1728 逃离迷宫 【BFS】
- WIN10桌面文件夹图标变黑解决方法~
- 基于激光投影技术的虚拟键盘
- 自学Python第九天- 模块、包、编码、文件操作、OS 模块、打包
- pycharm创建.ini文件
- matlab 文件操作 写入换行
- AIoT应用创新大赛-基于TencentOS Tiny 的遥控小车
- html canvas颜色渐变色,HTML5-画布(canvas)效果之-渐变色
- Cubase v5.1.1 macOS (移植版)音乐制作软件下载
- JAVA 后台ID生成器、生成16位ID纯数字