2022届字节跳动搜索算法实习生面经

一面(1h)

自我介绍+项目介绍
C++相关:智能指针的基本知识,boost库与锁
其他:Java相关(不了解),Linux内存管理(不了解),TCP三次握手,降维的方法,统计学习LR的公式
算法题:用两个栈实现队列的功能
概率题:圆上任取三个点,组成锐角三角形的概率

1.智能指针
share_ptr和weak_ptr的区别:shared_ptr用引用计数实现了多个指针共享资源,但可能形成循环引用,导致内存泄漏;weak_ptr以观察者的方式,可以在不增加引用计数的情况下对一个shared_ptr的状态进行观测,可以通过lock()返回shared_ptr对资源进行访问
unique_ptr只允许一个指针拥有一个资源,只能用move()转移所有权
2.锁
一开始问了读写锁,但由于只用过互斥锁
3.TCP三次握手
第一次:客户端主动connect服务器,发送SYN=1(表示是一个连接请求),序列号为j;服务器被动打开
第二次:服务器收到SYN后,发送一个ACK=1序列号为j+1的应答给客户端,同时自己也发送一个SYN=1的包给客户端(SYN+ACK包),序列号为k,服务器进入SYN_RECV状态
第三次:客户端收到SYN+ACK包,向服务器发送序列号为k+1的ACK包,发送完成后,服务器和客户端进入连接建立状态
4.降维
PCA与LDA的原理
5.LR的公式
主要是sigmoid函数的形式 1 1 + e − x \frac{1}{1+e^{-x}} 1+ex1
算法题
栈是FILO的,队列是FIFO的,因此第一个进入我们编写的队列的元素,要在一个栈的栈顶,反过来说就是,刚刚进入队列的元素要压入栈底。那么我们每加入一个元素,就把按照FIFO顺序存在一个栈里的元素,全部倒入另一个栈,然后把新的元素放到栈底,再倒回来即可。
概率题
三个点在同一半圆上时,组成的就是钝角(直角)三角形。那么锐角三角形中有一个顶点在另一个半圆上,固定两个点后,第三个点只能在这两个点所在直径的夹角对顶角所对的弧上,由此积分。

二面(40~50min)

自我介绍+项目介绍
根据项目的提问:介绍一下项目的整体实现,其中映射用到的方法与对比,神经网络面对少样本如何处理,数据增强能不能应用到这个项目上
算法题1:正数数组连续子序列之和大于m的序列个数
算法题2:有序质数数组任取两个数构成的真分数小于x的取法

根据项目提问
项目整体流程,映射用了线性映射,尝试过DLT、线性拟合和神经网络,主要因鲁棒性与精度的综合考虑选择了线性拟合。
神经网络由于样本多样性要求高,导致鲁棒性不高。
少样本主要解决方法:数据增强,few-shot learning等
数据增强能否使用:不太清楚是否有方法用在已提取的特征向量上
其他的Transformer, Attention等原理(不了解)
算法题1
双指针,由于正数,因此一旦满足m,则直接统计后面还剩多少个,即增加多少子序列,然后头指针向后移动一位。
算法题2
我想到的是对一个分母质数n,分子必须小于nx,在小于n的数组中寻找nx应该放在哪里,复杂度应该是O(nlogn),但应该还可以优化

三面(30min)

自我介绍+项目介绍
针对项目细节提问:项目整体流程,系统的硬件、软件的实现,简历中所述的定量指标的具体解释
C++:对虚函数的理解,虚函数的实现,set与unordered_set的区别
编译原理:高级语言编译为机器语言的过程(不了解)

四面HR面(30min)

自我介绍+项目介绍
主要针对前三轮未被提问的字节训练营项目、互联网+创新创业项目提问
团队合作过程中的心得、遇到的问题等

总结

C++的重点依然是智能指针、虚函数与多态、STL容器,由于项目与多线程编程相关因此也问及boost库和锁(这方面准备不算充分)。Linux、C++版本特性、编译原理(和嵌入式相关)还需要准备。
一面相对问题范围更广,之后逐渐集中到项目细节附带一些通用知识。

你可能感兴趣的:(算法,数据结构,c++)