C++ Back-End Development Interview Problems(Excerpt)

79 阅读3分钟

为了不泄露公司信息,故隐藏了公司名字。

XXX UE初级工程师

笔试:

三步式,依次递进

一面:

  1. [链表] 取链表中间节点,如果是环形链表呢?
  2. [树] 二叉树,二叉搜索树,查找时间复杂度以及极限情况。
  3. 怎么平衡二叉树的平衡(红黑树)。
  4. 怎么判断两棵树是否是镜像树
  5. 看你写过项目,用过 epoll,那你说为什么使用 epoll,还有哪些 IO 复用技术,对比其他苦(未明确提及select,poll), epoll 有什么好处,select, poll 的特点呢?
  6. 你知道长链接需要保活么?为什么需要保活?你的项目有实现吗?你怎么实现的?
  7. 游戏中会用到哪些数学知识?
  8. 最近有学到什么东西

二面:

  1. 若是你来实现 protobuf,你应该会怎么实现?键值对方式,数组方式的分别?序列化时,确定类型和不确定类型的区别在哪里?整型数字和整型数组的区别在哪里?整型数组和字符串之间的关系呢?
  2. 常用的数据结构有哪些?说两个熟悉的,并说一下他们的应用场景?hash 表你熟悉吗,这个效率是怎么样的?hash 碰撞的解决方案除了扩容还有哪些?
  3. 多线程中怎么实现的同步的?多线程中的锁有哪几种?
  4. 你项目里你说用过 Redis,那说一下用 Redis 是做什么的?是 C 端的还是 S 端的过程?为什么用 Epoll,不是有很多现成的小框架吗?
  5. 将下列结果输出出来
class A {
 public:
  int j = 5;
  int i = 1;
  void exec() {
    i = 2;
  }
}
class B {
 public:
  int i = 3;
  int j = 6;
  void exec() {
    i = 4;
  }
}
int main() {
  A a;
  B *bp = (B *)&a;
  B b = *bp;
  a.i // = ?
  bp->i // = ?
  b.i // = ?
  bp->exec();
  a.i // = ?
  bp->i // = ?
  b.i // = ?
  b.exec();
  a.i // = ?
  bp->i // = ?
  b.i // = ?
}
  1. 给定一个坐标系,只允许对它的轴进行反轴和交换位置,可以构建出多少种坐标系?
  2. 怎么判断左手坐标系和右手坐标系?你知道向量的计算吗?
  3. 对一个空对象调用他的方法,会发生什么情况

上海xx

一面:

  1. 析构函数用来做什么的,能不能重载?你重载过么?
  2. 指针和引用的区别?
  3. 多态是怎么实现的
  4. socket 编程的基本流程
  5. 多线程和多进程的区别。进程间的通信方式,线程间的通信方式,线程同步
  6. Linux 的 IO 的通信模型
  7. 分析简历上的项目经历

二面:

忘了记录

xx网络

  1. 讲一讲封装,继承,多态?多态怎么实现的?你用过纯虚类么?为什么要使用虚函数?
  2. map 和 unordered_map 的内部实现区别?
  3. Linux 五种 IO 模型、epoll 的特性有哪些?ET、LT 的区别?
  4. 怎么判断链表是否有环?
  5. 给定一组数,和一个数,怎么判断两个数相加等于这个整数?
  6. new 和 malloc 的区别,可以重载 new 和 delete 吗?
  7. 阻塞式 Recv/Send 和非阻塞式的区别?
  8. TCP 的三次握手的原理,四次挥手的原理,为什么会出现 TIME_WAIT。
  9. 线程的使用,你知道怎么同步吗,怎么使用?你知道哪些锁吗?

xx科技

  1. 两个栈实现一个队列
  2. epoll 的使用,ET 和 LT 的区别
  3. select 和 poll 与 epoll 的对比

xx科技

  1. 指针和引用的区别