讨论/求职面试/腾讯 | 天美工作室 | C++后台开发 | (22届春招,三轮技术面)| 2021/
腾讯 | 天美工作室 | C++后台开发 | (22届春招,三轮技术面)| 2021

字节跳动飞书C++客户端开发(22届春招,两轮技术面)
字节跳动data部门go后端开发(22届春招,三轮技术面)
腾讯天美工作室C++后台开发(22届春招,三轮技术面)

腾讯天美工作室后台开发

一面

  1. 输入:n、m,满足n%2m==0,有n个数字,每m个数取相反数,要求返回求和,一开始是负数。例:n=8,m=2,序列为-1、-2、3、4、-5、-6、7、8,结果为8。这个题很简单,就是要注意数据范围,只用int会溢出。
  2. 字符串解码
  3. 给n个数,随机输出m个不同的数(m<=n)。
    一开始想的是蓄水池抽样,后来面试官指出这样输出的结果相对顺序不会改变,结果没有体现处随机性。
    然后我问可以修改原数组吗,回答可以。
    那么可以这样做:每次随机输出一个索引,然后输出该索引,在把该结果和末尾交换,有效长度减一。
    有没有不修改原数组的方式,可能不一定是int而是某个比较大的结构体,并且强调数组不一定很长,我就说那就再开一个索引数组即可,然后没问了。
  4. 结构体内存对齐。
    假设结构体对象的首地址是0,则结构体中每个变量的首地址要能够整除该对象的字节数,且整个结构体的字节数要能够整除其中最大类型的字节数。已下面的结构体为例:
// 64位系统
struct T{
    int a;  //0-3
    char ch;    //4
    int b;  // 8-11
    long c; // 16-23
    char chs[12];    //24-35
};
// 总共占据40bytes
  1. epoll和select区别。select和epoll适用于什么场景?
    参考另一篇面经里面有。

  2. TCP和UDP的区别?
    image.png

  3. 用户层UDP收到的是完整的一个包吗?程序里如何保证收到的TCP数据是完整的?
    多个数据包被连续存储于连续的缓存中,在数据包进行读取时由于无法确认发生方的发送边界,而采用某一估测值大小来进行数据读出,若双方的size不一致时就会使发送方的若干包数据在接收方接收时粘成一个包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。可以通过添加长度信息的方式,或者采用一些结构换的报文格式,比如XML。

  4. Linux的虚拟内存、物理内存。
    虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。它有4个重要的能力:

  • 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在主存和磁盘之间来回传送数据,通过这种方式,它高效地使用了主存。
  • 他为每个进程提供了一致的地址空间,它高效地使用了主存。
  • 它保护了每个进程的地址空间不被其他进程破坏。
  • 他能够提供超出当前计算机本身物理内存的内存,有效应对了软件大小增速过快的问题。
    一般来说,虚拟内存中主要通过分页机制来实现,每个进程会有一个属于自己的页表,然后虚拟地址由虚拟页号和页内偏移量构成,通过虚拟页号在页表中查询到虚拟页的首地址,然后通过页内偏移量,我们可以找到目标地址。这个还可能会涉及到缓存不命中下的交换技术、多级页表、和分段技术,视情况决定是否要说。
  1. 然后问数据库学过吗?说自己学的不好,然后就没多问了。
    这场面试大部分时间都在写代码,至少写了30-40mins。整体感觉还可以,面试的时候交互也不错。

二面

  1. 介绍一下自己掌握的技术和知识,以及求职方向。针对里面的一些地方提问。
  2. epoll和select的区别。
    见另一篇文章,上面已有链接。
  3. LT模式和ET模式,ET模式下accept()为什么一些连接会接收不了?
    LT模式:LT是epoll默认的工作方式,支持阻塞和非阻塞两种机制。LT模式下内核会持续通知你文件描述符就绪了,然后你可以对这个就绪的fd进行I/O操作。如果不做任何操作,内核还是会继续通知你的。
    ET模式:ET模式相对LT模式更加高效,只支持非阻塞模式。在这个模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不再为那个文件描述符发生更多的就绪通知。直到你做了某些操作导致那个文件描述符不再为就绪状态了。
    ET模式在很大程度上减少了epoll事件被重复触发的次数,因此效率要比LT模式高。epoll工作在ET模式时,必须使用非阻塞套接口,以避免一个文件句柄的阻塞导致把其他文件描述符饿死。
    ET模式下,只会触发一次读事件,如果不循环读取,除非新的连接到来,其它未被读入的链接不会触发IO事件。
  4. 玩哪些游戏?提到了狼人杀,问如何设计狼人杀。
    主要是围绕TCP、UDO、服务器瓶颈来提问。基本都是纯分析,互动比较多,自己对回答也没把握。
  5. 大数据处理,一亿个数字(unsigned int)去重,如果限制内存100M怎么办?
    不限制内存的话就是位图,内存需要512MB,而如果限制100M,可以用布隆过滤器
  6. hash_table底层实现是什么?
    unordered_map和unordered_set的底层数据结构讲一下。
    底层为开链表实现,用一个数组存储桶,每个桶都是hash值相同的键的集合,用链表实现。通过hash函数找到对应的桶,然后在这个桶的链表上完成查找、删除、添加的操作。
    hash_table的扩容机制,底层维护一个负载因子,表示当前元素个数/桶的个数,一般默认超过0.75就扩容,底层数据结构维护了扩容的规模变化。
  7. 反问环节。

面试整体比较简单。

三面

  1. 自我介绍。
  2. epoll和select的区别。
  3. send函数会有哪些错误码?
  4. STL了解吗?说一下空间配置器,一级空间配置器、二级空间配置器。
    空间配置器是STL用来管理和分配内存的类型。STL有一级空间配置器和二级空间配置器。一级空间配置器就是对new和delete做了个简单的包装。二级空间配置器是利用的池的思想,用一个free-list维护很多不同大小的字节块(8-128bytes),然后每次就分配这样大小的内存块(就近取8的整数倍),如果超过128byte就直接用malloc分配。然后释放内存也放回free-list。如果free-list中没有对应的内存块了,就像内存池中申请内存(内存是一大块连续内存),然后返回用户需要的内存,其余插入到free-list中作为补充。如果内存池用完了,就调用malloc获取大块的连续内存。
  5. set和map如果要使用自定义的结构体,如何排序?自己传入一个比较函数。如果相等,底层如何判断?
    要么对key的类重载<运算符,要么传入仿函数。它们的返回值都是bool类型,小于返回true,否则返回false。判断相等的方法:不同顺序比较两次,如果都是false则相等。
  6. set和map如果用继承的方式开发,set继承map好还是map继承set好?
    我个人认为是set继承map,因为继承是一个is-a,map可以理解成一个set,而set无法理解成一个map。然后实际开发,也可以在map<key,value>对value设置为一个空的结构体类型就能够实现set了。
  7. 迭代器失效了解吗?
    数组型数据结构:该数据结构的元素是分配在连续的内存中,insert和erase操作都会导致后面的迭代器全部失效。
    链表型数据结构:对于list这类数据结构,内存不连续分配,insert不会造成迭代器失效,而erase会造成被删除的迭代器失效。
    树形数据机构:insert不会导致任何迭代器失效,而erase会导致被删除的节点的迭代器失效。
  8. hash_map和map的区别?
    前者是哈希表实现,是无序容器,支持O(1)的查找、删除、添加。
    后者是红黑树实现,是有序容器,支持log(n)的查找、删除、添加。
  9. 数据库学过哪些?
  10. 范式了解吗?
    这个比较多,一般只说前三个范式即可。
    1NF的定义为:符合1NF的关系中的每个属性都不可再分。表1所示的情况,就不符合1NF的要求。1NF是所有关系型数据库的最基本要求。
    第二范式(2NF)在1NF的基础之上,消除了非主属性对于码的部分函数依赖。其定义是不存在非主属性对码存在部分函数依赖关系。
    第三范式(3NF)在3NF的基础上,消除了非主属性对码的传递函数依赖。其定义是不存在非主属性对码存在传递函数依赖关系。
  11. 玩过哪些游戏?
  12. 王者荣耀的英雄技能效果的同步问题?
    状态同步和帧同步的问题。
  13. 反问环节。
20
共 9 个回复

看起来面试整体比较简单。

那我人没了,我被L1捞了,二面完后当备胎了,呜呜呜。。。

怎么可能是L1,是J1。大三本科生。

我也来观光。

感觉楼主很顶了

感觉楼主很强……

楼主是本科还是研究生呀?是成都天美L1还是其他地方的?

这是招实习吗 还是22届提前批开始了

昨晚刚挂在同部门同岗位的一面。。。