背景
差不多一月开始分类刷Leetcode,目前二百多题的进度。
看了一周Java面经,主要复习了JVM,看了Spring和JUC的浅层面试题。
网络和操作系统还没看。
HR打电话过来问实不实习,约了隔一个周末面试。
面试花了七十多分钟,先做题,然后每个方面都问了一些。
字节好像在家办公,不过面试氛围还是挺好的,面试官会给一些提示和积极的回应。
面试
自我介绍,讲了一个项目。
Part 1: 算法题
飞书共享文档根本卡的用不了…然后共享屏幕用记事本写的
两个题全都做过,基本直接写出来了
Alg1:删除空格(双指针)
void deleteSpace(string& s){
int fast = 0;
int slow = 0;
while(fast != s.size()){
if(s[fast] != ' '){
s[slow++] = s[fast];
}
fast++;
}
s = s.substr(0, slow);
}
Alg2:矩阵可达(动态规划)
Leetcode 62 原题,二维dp数组。
int routeNumber(vector<vector<int> >& A){ // 面试官强调尽量引用传递
int m = A.size();
int n = A[0].size();
if(m==0 || n==0){
return 0;
}
// 起始位置、末尾位置有障碍
if(A[0][0] == 0 || A[m-1][n-1] == 0){
return 0;
}
vector<vector<int> > dp(m, vector<int>(n, 0)); // dp数组, 初始化为0
dp[0][0] = 1; // 初始化(0, 0)
for(int i=1; i<m; i++){ // 初始化(0, j)
if(A[i][0] == 1)
dp[i][0] = 1;
else
break;
}
for(int j=1; j<n; j++){ // 初始化(i, 0)
if(A[0][j] == 1)
dp[0][j] = 1;
else
break;
}
// 状态转移
for(int i=1; i<m; i++){
for(int j=1; j<n; j++){
if(A[i][j] == 1){ // 可达
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
Part 2: 数据结构
- 数组、链表的区别,删除10th元素如何选择(取决于长度)
- key-value结构中,查找的时间复杂度(O(1))。hash/map如何存储(回答了BST->B+树),那这些数据结构并不能达到O(1)?
[哦,我傻了,是不是数组存储,按hash函数计算的index访问数组就可以了…
Part 3: 网络
面试官问擅长的科目,说网络还可以,其实最后都问了个遍…
- TCP, UDP的区别
- TCP中window的作用(回答了拥塞控制,提高并行度)
- TCP四次挥手
Part 4: 操作系统
- CPU内核态、用户态
- 并发
- CAS
总结
一共七十分钟,好像是经历过最长的面试了…感觉上面两道算法题还是给了点信心的,如果先做题做不出后面心态就很容易崩溃。多刷题吧,遇到原题的感觉真爽啊