STL和数据结构与算法
1.STL了解吗?常用哪些容器
2.List和vector有什么区别
底层:List 带有头结点的双向链表,存储在内存中不连续。
vector是类似于数组的顺序表,存储在内存中连续。
随机访问:vector支持( O(1)),List不支持。
插入: List效率为O(1),因为只用更改该节点的前后指针。
vector为O(n),因为插入vector要移动元素,并且有可能需要再次扩容。
内存碎片:因为List是不连续的,可能会出现内存碎片
而vector连续,不容易产生。
当然还有许多区别,这里不一一指出,面试中答出以上也算OK了。
(回答这类问题如果有把握的话可以把使用场景一起说了)
使用场景:
看是否需要随机访问,是经常用于随机访问还是插入。
3.讲一下vector的扩容机制
当vector本身容量不够存放时便会自动扩容达到动态数组的效果。
扩容不是简单的尾部增加空间,而是找到一块新的足够大的内存将之前已存在的数据搬运过去。
(比如 某个存放8个数据容器T此刻需要扩容,扩容前T[0]T[8]存放在地址A中,当扩容完成后,T[0]T[8]就不在地址A了,因为之前内存会被释放)
因此少进行vector的自动扩容会更好的提高效率。(利用构造函数申请好所需要的空间或者利用reserve())
不同的编译器扩容大小也不一样,vs15扩容是1.5,GCC是2。
重点要答出来:
为什么是成倍而不是固定增加?
为了使尾插入的时间复杂度成为O(1)
为什么是1.5或者2倍,不能是3或4倍?
倍数过大容易使申请的新空间比之前已经申请的旧空间还大,导致空间的无法重复利用。
4.vector< bool >有什么问题吗?vector< void >合理吗?
vector< bool >是陷阱,其中的元素并不是bool型,并且也不属于一个容器。
vector< void >不能通过编译。
(这个问的不多,但很有意思,可以去了解一下)
5.迭代器失效是什么原因
当容器扩容时,正如我们之前提到的元素迁移,元素被搬走,内存被释放,我们的迭代器可没有被转移指向新内存。
这样就会造成迭代器失效。
6.容器适配器知道吗,讲一下stack和queue
7.能和我说说优先队列的底层吗
堆
8.map和unordered_map的区别是什么
(红黑树和哈希表,顺便一提unordered_map用的开链法解决哈希冲突,什么是哈希冲突以及其他相关办法也得了解一下)
重点关注二者操作的时间复杂度和底层结构。
set和unordered_set同理,再想想set和map的区别就可以推出unordered_set和unordered_map的区别。
9.红黑树是什么,简单介绍一下,和平衡树的区别是什么
我当时看的漫画这篇,一次就了解了,有点长,滚轮都滚累了
不想看漫画的可以看下面这个
10.string为什么不提供分割方法
(这个很难,就遇到一次,和面试官聊天的时候提到的,我也有点懵为什么这么问,知乎上有帖子专门分析,感兴趣可以看看)
11.平常使用哪些排序算法,std::sort()用的哪种
STL中的sort并非只是普通的快速排序,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法。当数据量较大时采用快速排序,分段递归。一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。
简单来说就是根据数据量来选择合适的排序算法。快排如果递归太多次,就会改成推排序。
12.常见操作的时间复杂度(比如map和unordered_map的插入查找,vector和list的插入查找等等)
13.常见排序算法的时间复杂度,以及是否稳定
14.容器方法size capacity有什么区别
size是当前存放数量,capacity是容量,也就是可存放数量。
--------------------------------------下面是遇到算法题------------------------------------------------
括号匹配
(我用的栈)
找到链表倒数第k个数
(暴力,双指针)
单链表逆转
(双指针,快慢指针)
树的中序遍历
(递归非递归)
N个数中只有某个数出现的次数是奇数,如何找到哪个数字
(异或)
N*M的地图,从左上角开始只能向下和向右一次走一步,走到右下角有几种路线
(动态规划)
N(N特别特别大)个数据中找最大的数
(这个题特别经典,不管是CSDN或者Leetcode中都有相应的记录,一定要搞懂最少两种方法)
剩下想不起来了。。想起来再补充。。
---------------------------------------益智题目-----------------------------------------------------------
2的17428次方最后一位
一堆外观相同的球找唯一一个质量不同的球,不知道是轻还是重
\
剩下想不起来了。。想起来再补充。。
---------------------------------------学习数据结构和算法时-------------------------------------------------
做算法题一定要想想有没有别的方法,不管是从时间复杂度还是空间复杂度来优化这个算法。
面试的时候不是做出来那么简单,还会顺便问问有没有别的解法。
充。。