2023高频经典前端面试题(数据结构+算法篇,含答案)

个人主页:不爱吃糖的程序媛
‍♂️ 作者简介:前端领域新星创作者、CSDN内容合伙人,专注于前端各领域技术,成长的路上共同学习共同进步,一起加油呀!
✨系列专栏:前端面试宝典、JavaScript进阶、vue实战
资料领取:前端进阶资料以及文中源码可以在公众号“不爱吃糖的程序媛”领取

数据结构篇

1. 数组与链表的区别?(常考)

(元素个数,存储单元,元素的顺序关系,)
(1)数组的元素个数是固定的,而组成链表的结点个数可按需要增减;
(2)数组元素的存诸单元在数组定义时分配,链表结点的存储单元在程序执行时动态向系统申请;
(3)数组中的元素顺序关系由元素在数组中的位置(即下标)确定,链表中的结点顺序关系由结点所包含的指针来体现。
(4)对于不是固定长度的列表,用可能最大长度的数组来描述,会浪费许多内存空间。
(5)对于元素的插人、删除操作非常频繁的列表处理场合,用数组表示是不适宜的。若用链表实现,会使程序结构清晰,处理的方法也较为简便。
数组的优点:
随机访问性强
查找速度快

数组的缺点:
插入和删除效率低
可能浪费内存
内存空间要求高,必须有足够的连续内存空间。
数组大小固定,不能动态拓展

链表的优点:
插入删除速度快
内存利用率高,不会浪费内存
大小没有固定,拓展很灵活。
链表的缺点:
不能随机查找,必须从第一个开始遍历,查找效率低

2.数据结构基本知识

队列:先进先出,只能从尾部添加元素,在头部删除数据。
栈:后进先出,只能从尾部添加和删除元素。(栈内存的特点:存取速度快,但不灵活,同时由于结构简单,在变量使用完成后就可以将其释放,内存回收容易实现。)
链表:是线性结构,是一种有序的列表。在链表中,每个节点都有数据域和指针域。
堆:内存的存储不同与栈,虽然他们都是内存中的一片空间,但是堆内存存储变量时没有什么规律可言。

3.栈和堆的区别

4.计算机由什么组成?

计算机是由硬件系统(hardwaresystem)和软件系统(softwaresystem)两部分组成的。
计算机的基本组成包括输入设备、输出设备、存储器、运算器、控制器这五部分。

算法篇

  1. 常见的七种排序算法(重点)
    冒泡,插入,希尔,选择,快速,归并,堆

  2. 冒泡排序
    假设长度为n的数组arr,要按照从小到大排序。
    首先从数组的第一个元素开始到数组的最后一个元素为止,对数组中相邻的两个元素进行比较,如果位于数组左端的元素大于数组右端的元素,则交换这两个元素在数组中的位置。这样操作后数组最右端的元素即为该数组中所有元素的最大值。接着对该数组除最右端的n-1个元素进行同样的操作,再接着对剩下的n-2个元素做同样的操作,直至整个数组有序排列。

  3. 选择排序
    基本思想:首先在未排序数组中找到最小(大)元素,存放在数组的起始位置。
    再从剩余数组元素中继续寻找最小(大)元素,返回放在已排序数组的末尾
    重复第二步,直到所有元素都排序完成
    3插入排序()
    就是将无序序列插入到有序系列中,比如讲某数组排序,可以将第一个元素看做一个有序序列,剩下的看做一个无序序列,无序序列中的元素比有序序列的小就插在前面,比有序序列大就插在后面,以此类推。
    4希尔排序
    它是在插入排序的基础上进行了改进,先将数组的分割成若干个子序列分别进行插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
    5快速排序()
    基本思想:在已知数据集合中随便去一个基准(pivot)
    将其余数据以基准为中心,大于分放右边,小于的放左边
    将左右两个子集重复以上两个步骤。
    不稳定的排序,如果有两个顺序是一样的。
    6归并排序
    7堆排序
    延伸:sort方法你认为它内部用的是哪种排序算法?(这道题是没有回答出来的)
    毫无疑问是用到了快速排序,但不仅仅只用了快速排序,还结合了插入排序和堆排序。
    https://blog.csdn.net/qq_21950929/article/details/106028798
    延伸:快速排序的中位数是放哪里?

diff算法

diff的过程,就是调用patch函数,像打补丁一样修改真实dom。通过比较新旧两个虚拟节点,进行对应的操作。
1.通过key和节点选择器对新旧dom进行比较,如果不同新节点直接把老节点整个替换掉;
2.如果是相似节点,先比较引用是否一致,一致则说明没有变化,直接返回;
3.再比较文本节点,需要修改,则调用Node.textContent = vnode.text;
4.再比较两个子节点,若只有新节点有子节点,则通过createEle创建新的子节点,若只有旧节点有子节点,则直接删除老节点,若新旧节点都有子节点,且不一样,调用updateChildren更新。

你可能感兴趣的:(面试宝典,数据结构,算法,链表)