2019年9月21日 一面:一个小时, 通过
- 两道coding题
a. 输入四个点,判断这四个点能不能构成正方形。
思路:
step1:四个点、计算两两间的距离,共6个距离。
step2:若是正方形,距离只有2中长度,且长边是短边的根号2倍。
继续问:为什么还有加上根号2倍的限制,举一个四个点只用两种长度的边,但不是正方形的例子。如带有一个等边三角形风筝模型。
b. 给一堆石子,数量为n。甲乙两个一次能拿1个或者2个,甲是先手,谁拿走最后一个石子谁就赢了。假设甲乙都是足够聪明的。问谁会赢。
答案:当n能整除以(2+1)时,乙赢;反之甲赢;
为什么:设n能整除以(2+1)是平衡状态;当n处于平衡状态是,不过先手拿了多少个,我后一个人后能将n恢复到平衡状态。到n=3时,先手必输。故n能整除以(2+1)时,乙赢;而n不能整除以(2+1)时,甲可以将n转为平衡状态,这样就是乙先手的平衡状态了,就是甲赢。
- 聊了简历上自己做的项目,就聊自己做了什么。没有深入。
2019年9月27日 二面:一个小时,未知
- 一道coding题:给你一个n*n的正整数矩阵,求左上角到右下角的最短路径和。
解:动态规划问题,状态转移:
//dp[i][j] = min(dp[i-1][j], dp[i][j-1])+matrix[i][j]
//完整代码
#include <iostream>
#include<vector>
using namespace std;
// dp[i][j] = min(dp[i-1][j], dp[i][j-1])+matrix[i][j]
int mindepth(vector<vector<int>> M){
int n = M.size();
vector<vector<int>> dp(n, vector<int>(n, M[0][0]));
for(int i=1; i<M.size(); i++){
dp[i][0] = dp[i-1][0] + M[i][0];
}
for(int i=1; i<M[0].size(); i++){
dp[0][i] = dp[0][i-1] + M[0][i];
}
for(int i=1; i<M.size(); i++){
for(int j=1; j<M[0].szie(); j++){
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + M[i][j];
}
}
return dp[n-1][n-1];
}
- 聊简历上的项目,聊得比一面要深入一些。