【2021校招】猿辅导客户端 笔经+面经
个人背景
本科非科班,硕士软件工程,无实习,无论文,客户端零基础,编程语言只了解C/C++。8月28日收到猿辅导意向书,在牛客网上受益颇多,特来回馈。
笔试(8 月1日)
笔试时间90分钟,15道选择题,3道编程题选择题不能切换浏览器界面,编程题可以切出来在本地IDE调试
笔试过程中电脑录屏,手机扫码打开笔试助手,手机不能锁屏和切换界面
选择题
1.两个线程以相同的顺序加锁解锁,哪个顺序可能死锁Lock(m1) Lock(m2) Unlock(m1) Lock(m1) Unlock(m2) Unlock(m1)
2.数据库SQL语句,查询在表table1不在table2的id, left outer join
3.下面程序输出
int fun1(int i) {
if(i < 10)
return i;
return ((5*fun1(i - 1) + 2*fun1(i - 2)+fun1(i-3) + fun1(i-4))& 0x5fff);
}
int fun2(unsigned int i) {
unsigned int f = 2020;
return (f&i)/2;
}
int main() {
int n = fun2(fun1(101)) % 4;
printf("%d\n", n);
return 0;
}
4.前序遍历和中序遍历相反,问树的特征
5.出栈入栈顺序判断
6.下列哪些网络协议属于同一层
7.逻辑推理题
8.40个小朋友买票,票价5元,30个小朋友每人有一张5元,10个小朋友每人有一张10元,每个人买自己的票,售票处初始没有零钱。问不用等找零的概率。
9.两个人抛硬币,谁先抛到正面谁赢,问某个人赢的概率
10.给个排序部分过程,让判断用的是哪种排序算法
顺序不对,还有5道题记不清了
编程题
1.类似leetcode 732,应该是考线段树、树状数组,我用map将坐标离散化也能AC2.分彩票,n张彩票,n个人,每张彩票有一定的奖励值,某个人一开始有所有的彩票,然后自己留一张,分给别人一部分,不一定每人一张,后面没人将多出来的再分给其他人。某个人的奖励值是自己手中的彩票和其他的一部分,选择其他部分有要求。这个比较复杂,就是如果A把票分给B,B再分给C的话,A可以选择A的奖励值,也可以选择A+B的奖励值,也可以A+B+C,但不能选A+C,因为B分给C,不选B的话,也不能选B分发的所有部分
第一行一个数n,后面第2行道第n+1行中每行有两个数,A和B,A表示自己手中彩票奖励值,B表示自己的彩票是从第几行分过来的,0表示最开始的那个人。
例如
3
2 0
1 2
-1 2
第2行的那个人为A,第3行的那个人为B,第4行的那个人为D,彩票最开始在A手中,然后A分给B和C,所以A可以选A,A+B,A+C,A+B+C,最大值为2+1=3,最大值不一定非得在A处获得。
思路:根据分发过程建树,树形dp
3.题都没看完。。。
笔试总结
猿辅导笔试难度不小,题的质量很高,知识点覆盖较广,且均为主流知识点,考察方式灵活,且今年的题与去年的题风格保持一致,往年试题具有较***价值。 编程题挺难的,经过这次笔试,觉得自己编程基本功有待提高,第2题看完题之后5分钟就有了思路,但是在实现建树的时候花了太久的时间,导致第3题都没时间看了。
C/C++语言
1.extern C
2.const
const int *p int * const p
3.虚函数、虚表、纯虚函数、虚析构函数
网络
4.各层网络协议
5.tcp/ip协议
6.tcp 接收窗口
7.http返回码
编程题
8.翻转链表,从第i个位置到第j个位置(i,j都可能越界)
思路:直接模拟,先找到起点,从起点开始翻转,到终点结束
一面(8月8日)
自我介绍+项目相关C/C++语言
1.extern C
2.const
const int *p int * const p
3.虚函数、虚表、纯虚函数、虚析构函数
网络
4.各层网络协议
5.tcp/ip协议
6.tcp 接收窗口
7.http返回码
编程题
8.翻转链表,从第i个位置到第j个位置(i,j都可能越界)
思路:直接模拟,先找到起点,从起点开始翻转,到终点结束
9.二叉搜索树,找出两个节点差值的绝对值最小值
思路:中序遍历,计算相邻位置的差,我用的非递归中序遍历
反问
基础知识
1. .进程调度策略
先来先服务、短作业优先、高响应比优先
多级队列反馈问了一下细节
2.锁的分类了解(不会)
乐观锁、悲观锁、公平锁、非公平锁、可重入锁
3.死锁举个例子
4.数据库事务的理解
编程题
1.使用创建好的单链表实现队列,实现两个方法,入队和出队
思路:在链表上记录队首和队尾,根据出队和入队滑动队首和队尾,注意循环队列情况,
加问:队列为空,出队怎么返回,我一开始说返回-1,后来说改成抛异常,但我不会用,面试官说可以了,知道抛异常就行,不会写没关系。
2.二叉树中所有节点值为正,给定target,求出从根节点开始的路径中,路径和大于等于target的情况中,找出最小的路径和,路径终点可以不到叶子节点,返回最小路径和,找不到满足条件的路径,返回0;
要求:不准用全局变量,不调用用其他函数;
思路:自身递归,满足条件返回,否则递归左右子树,找出子树中最小路径和,返回根节点值+左右子树中结果最小的那个。
加问:全局变量有什么风险,这是额外问题,不影响面试。
思路:中序遍历,计算相邻位置的差,我用的非递归中序遍历
反问
二面(8月14日)
自我介绍基础知识
1. .进程调度策略
先来先服务、短作业优先、高响应比优先
多级队列反馈问了一下细节
2.锁的分类了解(不会)
乐观锁、悲观锁、公平锁、非公平锁、可重入锁
3.死锁举个例子
4.数据库事务的理解
编程题
1.使用创建好的单链表实现队列,实现两个方法,入队和出队
思路:在链表上记录队首和队尾,根据出队和入队滑动队首和队尾,注意循环队列情况,
加问:队列为空,出队怎么返回,我一开始说返回-1,后来说改成抛异常,但我不会用,面试官说可以了,知道抛异常就行,不会写没关系。
2.二叉树中所有节点值为正,给定target,求出从根节点开始的路径中,路径和大于等于target的情况中,找出最小的路径和,路径终点可以不到叶子节点,返回最小路径和,找不到满足条件的路径,返回0;
要求:不准用全局变量,不调用用其他函数;
思路:自身递归,满足条件返回,否则递归左右子树,找出子树中最小路径和,返回根节点值+左右子树中结果最小的那个。
加问:全局变量有什么风险,这是额外问题,不影响面试。
反问
2.项目相关
基础知识
3.虚拟内存,为什么提供隔离和保护,为什么要有页表和页目录表,
4.堆和栈的区别,为什么要分成堆和栈?
5.智能指针说一下,shared_ptr和unique_ptr如何实现?
6.fork()父进程和子进程的地址空间的区别
编程题
7.蛇形有序矩阵N*M,第一行升序,第二行降序,第三行升序,每一行的最小值都要比上一行的最大值大,在矩阵中查找target是否存在。
思路:将矩阵坐标映射为有序数组索引,在有序数组中二分查找
8.1TB数据排序思路,说了一下分段排序,然后用堆合并
编程:合并K个有序数组
思路:用堆记录每个数组的当前最小值
三面(8月23日)
1.自我介绍2.项目相关
基础知识
3.虚拟内存,为什么提供隔离和保护,为什么要有页表和页目录表,
4.堆和栈的区别,为什么要分成堆和栈?
5.智能指针说一下,shared_ptr和unique_ptr如何实现?
6.fork()父进程和子进程的地址空间的区别
编程题
7.蛇形有序矩阵N*M,第一行升序,第二行降序,第三行升序,每一行的最小值都要比上一行的最大值大,在矩阵中查找target是否存在。
思路:将矩阵坐标映射为有序数组索引,在有序数组中二分查找
8.1TB数据排序思路,说了一下分段排序,然后用堆合并
编程:合并K个有序数组
思路:用堆记录每个数组的当前最小值
面试总结
面试基础知识问的比较深入,感觉猿辅导比较重视基础吧,每次面试都有两道编程题,我编程题做的十分细致,没有被挑出毛病