Lead Round
整体回顾
做得好的:很勇敢,很敢于沟通,把想到的都说出来
做得差的:听信了流传的说法“外企只考算法”,没复习!而且踩了一个大坑,在ML/DL基础非常弱+没复习的情况下,说自己想做算法。这就是送人头吧…
面试要展示对自己最有利的部分,还不如踏踏实实地说自己想做研发,这样应该直接奔着八股文+算法题就去了
Behavior Question
还踩了behavior question的坑,说自己的优点和缺点
缺点:试图把“做事追求完美”说成缺点,但是因为之前没演练过,面试官很犀利地问:那你是说你写代码很慢吗?
现在都不记得我圆了啥了,我就说一开始确实是,后来有不懂的及时问同事、及时沟通清楚明晰思路,然后现在做事效率就比较高了…感觉这个问题差点半条命都没了,差一点就挂了:)
机器学习
没复习,可以说是稀碎:)
- over-fitting和under-fitting
- 怎么drop-out,常见的drop-out方式有哪些
计算机基础
- 讲讲垃圾回收(Garbage Collection)
答:
Java里面有四种引用
引用计数法、可达性分析、GC Root - 进程间通信的方式
- 讲讲进程和线程的区别
- 堆和栈的区别是什么
算法
一道dp题
一个矩阵,从第一列走到最后一列,求沿途最大和
每次(i,j) 只能从3个地方转移过来 (i-1,j-1), (i,j-1), (i+1,j-1)
//int[][] matrix
//dp[i][j]
//j=0: dp[i][j] = a[i][j]
//j>0: dp[i-1][j-1], dp[i][j-1], dp[i+1][j-1]
//i [0, nr-1] max(dp[i][nc-1])
public int getMaxPathSum(int[][] matrix) {
if(matrix == null || matrix.length == 0)
return -1;
int nr = matrix.length, nc = matrix[0].length;
int[][] dp = new int[nr][nc];
for(int i=0; i<nr; i++) //col 0
dp[i][0] = matrix[i][0];
for(int j=1; j<nc; j++){
for (int i=0; i<nr; i++){
if(nr == 1)
dp[i][j] = (i == 0) ? matrix[i][j] : (dp[i][j-1] + matrix[i][j]);
if(i == 0)
dp[i][j] = Math.max(dp[i][j-1], dp[i+1][j-1]) + matrix[i][j];
else if (i == nr-1)
dp[i][j] = Math.max(dp[i][j-1], dp[i-1][j-1]) + matrix[i][j];
else
dp[i][j] = Math.max(Math.max(dp[i-1][j-1], dp[i][j-1]), dp[i+1][j-1]) + matrix[i][j];
}
}
int ans = dp[0][nc-1];
for(int i=1; i<nr; i++)
ans = Math.max(ans, dp[i][nc-1]);
return ans;
}
做算法题过程中的交流:
- 请问您期望使用白板,还是IDE也可以?
面试官:IDE就行 - 面试官:写之前先说一下你的思路,还是你可以先说一下你的思路
我:嗯我首先想到的是用动态规划的方法 - 先和面试官表达了我的思路,问是否可行
面试官:开始写吧 - 我说先考虑一下corner case
面试官:什么是corner case?
我:一些边界情况的输入,或者程序运行时遇到的一些异常的输入 - 写完了,现在我想自测一下可以吗
用注释的方式写测试用例、肉眼检查运行
自测的时候发现有一些边界条件没注意到,又加了一行代码 - 最后问面试官,需要和您分析一下我的代码吗?
面试官说不用了,你写的时候我一直在看