-
笔试难度:
很难
-
面试难度:
难
-
工作感受:
很好
面的是深信服 的星耀计划中的C/C++岗位。
笔试,第一题是种树问题,考察深搜+回溯,第二题是黄金营业时间,考虑问题的边界细节。个人总结:
1、拿到题的时候先把所有题目看完,并先攻克简单的题
2、dfs加回溯需要加强熟悉
3、对细节把握加强
第一面:
时间:5月30日。20min
问题:
n叉树的复杂度
快排(复杂度、实现)
dfs、bfs
ARP
hash表(实现原理)
Linux
虚函数(...)
malloc和new
free(free指针为什么知道多少大小)
解答:
n叉树的深度复杂度
O(nlogn)= n(1 +1/2+1/3 +1/4 + 1/5+ 1/6+1/7+1/8 +...1/n)(若每次问题的复杂度为n则为nlogn)
O(logn)= 1 +1/2+1/3 +1/4 + 1/5+ 1/6+1/7+1/8 +...1/n(用常数时间将问题的大小削减为某一部分(通常是1/2))
算法的实现(一)时间复杂度为O(N),空间复杂度logN
1.int maxDepth(Node* root)
2.{
3. if(root==NULL)
4. return 0;
5. int res=0;
6. for(int i=0;i<root->children.size();i++)
7. {
8. res=max(res,maxDepth(root->children[i])));
9. }
10. return 1+res;
11.}
算法的实现(二)时间复杂度O(N),空间复杂度logN
1.queue<Node*> q;
2.int maxDepth(Node* root)
3.{
4. if(root=NULL)
5. return 0;
6. int res=0;
7. q.push(root);
8. while(q.size())
9. {
10. for(int i=q.size();i>0;i--)
11. {
12. Node* t=q.front();
13. q.pop();
14. for(int j=0;j<t->children.size();j++)
15. {
16. q.push(t->children[j]);
17. }
18. }
19. res++;
20. }
21. return res;
22.}
快排(复杂度、实现)
排序方法 平均情况 最好情况 最坏情况 辅助空间 稳定性
冒泡排序 O(n2) O(n) O(n2) O(1) 稳定
简单选择排序 O(n2) O(n2) O(n2) O(1) 不稳定
直接插入排序 O(n2) O(n) O(n2) O(1) 稳定
希尔排序 O(nlogn)~O(n2) O(n1.3) O(n2) O(1) 不稳定
堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不稳定
归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 稳定
快速排序 O(nlogn) O(nlogn) O(n2) O(logn)~O(n) 不稳定
1.void QuicSort(vector<int> &arr,int left,int right)
2.{
3. while(left<=right)
4. return;
5. int i=left,j=right;
6. int temp=arr[left];
7. while(i<j)
8. {
9. while(arr[i]<=temp&&i<j)
10. i++;
11. while(arr[j]>=temp&&i<j)
12. j--;
13. if(i<j)
14. swap(arr[i],arr[j]);
15. }
16. arr[left]=arr[i];
17. arr[i]=temp;
18. //swap(arr[i],arr[left]);
19. QuicSort(arr,left,i-1);
20. QuicSort(arr,i+1,right);
21.}
时间复杂度:nlogn
解释:每次排序的复杂度为O(n),而每次递归进去的复杂度近似于O(n/2)所以为nlogn
dfs、bfs
https://www.jianshu.com/p/bff70b786bb6
使用队列Queue实现图的BFS遍历
递归实现图的DFS遍历
使用栈Stack迭代实现图的DFS遍历
广度优先搜索是连通图的一种遍历算法这一算法也很多重要图的算法原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了宽度优先搜索类似的算法。
深度优先搜索是一个针对图和树的遍历算法,英文缩写为DFS,一般用堆数据结构来辅助实现DFS算法。
ARP
ARP协议(地址解析协议Address Resolution Protocol),根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网上的所有主机,并接收返回消息,以此确定目标地址;接收到返回消息后将该IP地址和物理地址存入本机ARP缓存(缓存机制->超时重发,拥塞控制,滑动窗口)中并保留一段时间,下次请求时直接查询ARP缓存以节约资源。
ARP缓存是个用来存储IP地址和MAC地址的缓存区,其本质就是一个IP地址—>MAC地址的对应表,表中每一个条目分别记录了网络上其他主机的IP地址和MAC地址(类似于路由表)
hash表(实现原理)
https://blog.csdn.net/duan19920101/article/details/51579136/
散列表(Hash table,也叫哈希表),时根据(key value)而直接进行访问的数据结构。它通过关键码值映射到表中一个位置来访问记录,以加快查找速度。这个映射叫做散列函数,存放记录的数组叫做散列表。
若关键子为k,则其值存放再f(k)的存储位置上。由此,不需要比较直接取得所查记录。
对不同的关键字肯能得到同一散列地址,k1≠k2,而f(k1) ≠f(k2),这种现象称为冲突。根据散列函数f(k)和处理冲突的方法将一组关键字映射到一个有连续地址集上,并以关键字地址集中的“像”作为记录在表中的存储位置。
若对于关键字集合中的人一个关键字,经散列函数映像到地址集合中任何一个地址的概率时想等的,则称此类散列函数为均匀散列函数,这就使关键字经过散列函数得到一个“随机地址”
哈希表的优点
不论哈希表中数据有多少,增加,删除,改写数据的复杂度平均都是O(1),效率高
实现哈希表
1、哈希表原理
如果说每一个数据它都对应着一个固定位置,那我们查找特定一个数据时,就可以直接查看这个数据对应位置是否存在数据。例子:开学的时候,老师会给学生每一个人分配一个位置,而且不允许学生随便乱坐位置,以后老师要查看今天李刚同学有没有上课,直接看李刚同学的位置是不是有人就可以判断,没必要点名。
2、实现简单的哈希表
哈希表是最常用的数据结构之一,对于其用法,大家都非常熟悉,这里详细探讨一下其原理。哈希表的底层实际上是基于数组来存储的,当插入键值对时,并不是直接插入该数组中,而是通过对键进行Hash运算得到Hash值,然后和数组容量取模,得到在数组中的位置后再插入。取值时,先对指定的键求Hash值,再和容量取模得到底层数组中对应的位置,如果指定的键值与存贮的键相匹配,则返回该键值对,如果不匹配,则表示哈希表中没有对应的键值对。这样做的好处是在查找、插入、删除等操作可以做到O(1) O(1)O(1),最坏的情况是O(n) O(n)O(n),当然这种是最极端的情况,极少遇到。
Map与hashmap区别
Map集合的特点:
在网上看到有关STL中hash_map的文章,以及一些其他关于STL map和hash_map的资料,总结笔记如下:
1、STL的map底层是用红黑树实现的,查找时间复杂度是log(n);
2、STL的hash_map底层是用hash表存储的,查询时间复杂度是O(1);
3、什么时候用map,什么时候用hash_map?
这个要看具体的应用,不一定常数级别的hash_map一定比log(n)级别的map要好,hash_map的hash函数以及解决地址冲突等都要耗时间,而且众所周知hash表是以空间换时间的,因而hash_map的内存消耗肯定要大,一般情况下,如果记录非常大,考虑hash_map,查找效率会高很多,如果要考虑内存消耗,则要谨慎使用hash_map。
虚函数(...)
malloc和new
malloc分配内存大小至少维size参数所指定的字节数
malloc的返回值是一个指针,指向一段可用内存的起始地址
多次调用malloc所分配的地址不能又重叠部分,除非某次malloc所分配的地址被释放掉
malloc应该尽快完成内存分配并返回
实现malloc时应同时实现内存大小调整和内存释放函数(realloc和free)
malloc函数在内存中找一片指定大小的空间,然后将这个空间的首地址给一个指针变量,这里的指针变量可以时一个单独的指针,也可以是一个数组的首地址。物理上可以不连续,逻辑上是连续的。
malloc的具体实现机制:Linux内存管理。
new返回指定类型的指针,并且可以自动计算所需要的大小,(先构造函数,再申请内存,delete则正好相反)
free(free指针为什么知道多少大小)
系统在分配内存时除了分配指定的内存空间外,还有分配用于保存内存空间大小等消息,存放于申请空间之前。所以内存释放时不再需要指定释放多大的内存空间,只需要指定该内存空间的首地址。
第二面:
时间:6月6日,30min
问题:"30min
基于项目问的文件读写操作
TCP三次握手协议(SYN,SYN+ACK,ACK)
四人过桥
自己最自豪的经验
自己解决的问题
数据库的基本操作
Linux操作
问考官问题"
最好许愿实习 offer
发表于 2020-06-06 22:55:54
赞
(6)