摩尔线程_社招面试经验分享
回馈牛客各位网友,希望能帮助各位,岗位是c++软件工程师
一面
一面是上海那边的工程师给我面试,当时的上海仍在封城状态当中
- 自我介绍
- 问了一个ip地址正则表达式的写法(回答忘了,因为当时开发中写过一个验证邮箱的功能用到的正则匹配,当时是查的,在菜鸟教程上就可以查到)
- 问我python,实际上并没有准备python的内容
- 然后是传参指针和引用的区别,以及在汇编层面上如何体现
我当时的回答因该是搞混了传值和传引用,底层其实传指针和传引用是一样的,可以参考
https://blog.csdn.net/qq_49613557/article/details/119052970 - 讲一讲设计模式,
简单说了一下项目中常用的单例模式,注意要知道用单例模式的常用场景
二面
当时以为一面挂掉了,结果给我发了两次二面邀请我都没看见,后来有一天看邮箱面试链接竟然过期了,赶紧联系hr
二面主要是聊了聊项目经历,捎带着一些综合能力,特意问了我FFT、傅里叶变换,当时我有点懵就想不起来了。。。面试官很nice说这个问题留作作业,下次考(当时比较高兴的是现场就通知我过了)
三面
当时北京也封城了,公司也都在家办公加上可能面试官们比较忙,过了大概一个月左右三面,这回是正经的技术面试:
1.自我介绍
2.c++和C的区别
3.多态的实现,包括细节
4.基类和子类是同一个虚表么
5.多继承情况下,子类有几个虚表
6.如何避免内存泄漏(谈到智能指针)
7.智能指针有几种?原理?什么情况下使用shared_ptr?
8.如何将unique_ptr和容器一起使用(没答好,确实没用过)
9.C++内存空间,各个空间区别
10.如何实现一个类,只能在对空间上创建对象(差点没答出来,大概是构造函数放在private中,然后设计方法GetObj(),函数return new对象)
11.TCP如何保证可靠性传输
1.校验和 发送的数据包的二进制相加然后取反,目的是检验数据在传输过程中是否有变化。如果收到段的校验和有差错,TCP将丢弃这个报文段和不确认接收到此报文段。 2.确认应答 + 序列号 TCP给发送的每一个数据包进行编号,接收方对数据包进行排序,把有序数据传递给应用层。 3.超时重传 当TCP发出一个段后,会启动一个计时器,等待目的端口确认接收到这个报文段。如果不能及时收到一个接收确认,将重传这个报文段。 4.流量控制 TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能够接纳的数据。当接收方来不及处理发送方的数据时,能够提示发送方降低发送的速率,防止包丢失。 TCP用的流量控制协议是可变大小的滑动窗口协议。接收方有即时窗口(滑动窗口rwnd),随ACK报文发送。 5.拥塞控制 当网络拥塞时,减少数据的发送。 发送方有拥塞窗口,随ACK报文发送。
12.创建服务器是都有哪些步骤
建立TCP服务器连接的过程中主要通过以下的系统调用序列来获取某些函数,这些系统调用主要包括有: socket() 创建套接字 bind() 绑定本机端口 connent() 建立连接 (TCP三次握手在调用这个函数时进行) lisiten() 监听端口 accept() 接收连接 recv()、read()、recvfrom() 数据接收 send()、write()、sendto() 数据发送 close()、shutdown() 关闭套接字 使用close()时,只有当套接字的引用计数为0的时候才会终止连接,而用shutdown()就可以直接关闭连接
13.编程题:中序遍历二叉树,非递归
// 摩尔线程三面代码题目,非递归方式的二叉树中序遍历,核心代码 template<typename T> struct node { node* right; node *left; T value; } vector<T> TraverseBinaryTree(node* root) { vector<T> res; stack<node *> s; while (root!=nullptr || !s.empty()) { while (root != nullptr) { s.push(root); root = root->left; } node *n = s.top(); s.pop(); res.push_back(n->value); root = n->right; } return res; }
四面
去了望京的公司现场(建议地铁公交),然后先HR面,再两轮boss面试,主要是聊一些公司和个人情况,以及感兴趣的业务方向
#春招# #面经# #摩尔线程# #摩尔线程智能科技(北京)有限责任公司#