简单记录一下近期互联网实习面试情况
小红书 媒体中台
三轮面试
一面(已过)
关于C++
- 多态如何实现?底层原理?(我答的虚函数+子类重写,底层是虚函数表、虚函数指针,但是语无伦次)
关于OS
- 进程线程区别?
- 线程与创建它的进程共享了哪些部分?
关于网络
- TCP三次握手,四次挥手
- 为什么四次挥手后客户端需要TIME_WAIT一段时间?
手撕算法
- 二叉树后序遍历
二面(已过)
关于项目
- 队列式缓冲区pop操作为什么要加锁?是不是没有必要加锁?
- 堆区和栈区的区别?
- 为什么要编码成char数组,为什么不直接转成string?(考虑到效率问题)
- 为什么要设定五种等级?动态修改日志等级的作用是什么?当前输出的日志等级是什么时候确定的?
关于C++
-
std::map和std::unordered_map的底层原理?区别是什么?遍历操作复杂度是什么样的?各适用于什么样的数据情况?
-
std::vector扩容原理?如果我想让扩容的容量减小,怎么操作?
-
std::deque的底层原理?
-
C++中一个类默认有多少个构造函数?
-
类中一个函数后加const修饰是什么作用?
-
std::forward()起到什么作用?什么应用场景?
关于网络
问到这里发现我全都会,直接说问一个比较难的计算机网络问题:
- A端发送一个UDP报文给B端,但此时B端没有bind端口,那么这时A端会收到什么样的响应报文?(太细节了,他说的答案我都没听说过。。。)
手撕算法
- 三数之和(排序 + 双指针),原题:15. 三数之和 - 力扣(LeetCode)
三面
HR面,问一些关于自己和公司的问题。。。
慧国科技 软件开发
仅一轮面试,问的全是语言基础,无算法题。
关于项目
- 锁是什么锁?如何实现的?为什么自己实现自旋锁,有没有跟其他锁对比过?
- 多线程操作在哪里体现?如何保证线程安全?
- 遇到bug如何调试?gdb如何调试多线程?
关于基础
- 指针和引用的区别
- 全局变量和局部变量能否重名?局部变量作用域?
- 预编译阶段聊不了解?宏定义是什么?
- 静态链接库、动态链接库,具体操作?
Bilibili 测试开发
一面(已过)
关于项目
- 做项目时遇到问题怎么解决的?(gdb调试)
- 日志库有没有做可靠性的检查?(没有)
关于基础
- HTTPS的加密流程?(TLS四次握手过程 等等)
手撕算法
- 给n个字符串,输出最长的2个。
二面(我直接推掉了。。对不起)
Bilibili C端开发
一面
关于项目
-
参考过什么开源代码?
-
自旋锁?为什么不用互斥锁?
-
循环缓冲区?
关于基础
- C++11/14/17新特性列举两个?
- shared_ptr的问题,循环引用
其他
- 实现一个类的默认析构拷贝等构造函数,里面有个char*数组
寒武纪 高性能计算C++开发
总结一下,一开始狠狠夸我,然后狠狠爆杀我。首先,面试官夸我简历很优秀,并且觉得我在某些方面比他强。然后他说觉得我各方面水平都可以,不问基础的问题了,直接上来就问真实开发场景。。。
关于基础
- 堆的构建原理?
- Linux 的I/O多路复用技术有哪些?具体原理?
场景题
场景1. 真是项目中可能需要手写很多测试用例,例如我现在只能生成0~1之间的随机浮点数,那么如何根据这个生成一个具有高斯分布的测试用例?
场景2. 现在开发了很多算子,要做正确性测试,每次测试需要计算很久,很多算子都做这么多测试,跑下来可能要十几天时间才能跑完。现在,可能遇到了内部架构需要调整,但是算子不变,每次做完内部架构的调整之后,都需要重新跑一遍测试结果,这又会花费很多时间,而且我可能需要多次调整内部架构,请问如何优化这个过程?
商汤科技 算法开发
一面
全是关于深度学习和算法的。。。
- batch normalization是什么?有什么作用?(答了个大概,真忘了。。。)
- 问论文项目。。(介绍了一下我的论文)
- Python如果跑得特别慢,如何去优化效率?(for循环改内置函数、jit即时编译、用numpy scipy库等)
手撕算法
一个长度为n的字符串,输出其最长回文子串的长度。
原题:5. 最长回文子串 - 力扣(LeetCode)(这题是输出string,但是我考的时候是输出长度)
我考场写的代码,记忆化搜索:
class Solution {
public:
string longestPalindrome(string s) {
string ans = "";
int n = s.size();
int maxh = 1;
vector f(n, vector(n, -1));
auto dfs = [&](auto &&self, int i, int j) -> int{
if(f[i][j] != -1) return f[i][j];
if(i==j) return f[i][j] = 1;
if(i==j-1){
if(s[i] == s[j]){
if(2 > maxh){
maxh = 2;
}
return f[i][j] = 1;
}else{
return f[i][j] = 0;
}
}
if(s[i] == s[j] && self(self, i+1, j-1)){
if(j-i+1 > maxh){
maxh = j-i+1;
}
return f[i][j] = 1;
}else{
self(self, i+1, j);
self(self, i, j-1);
return f[i][j] = 0;
}
};
dfs(dfs, 0, n-1);
return maxh;
}
};