华为1面 记录+思考
就在刚刚和华为进行一面,感觉没有八股 没有技术问题,更偏向思考 逻辑能力等等,写出来供大家参考。
基本问题
1、简单的自我介绍
2、本科 研究生期间 都学过哪些课程?比如大概的学习路线是怎样的?
3、c语言还记得吗?大概说说还记得哪些
4、算法平时有去练习吗?刷了多少道?大概讲讲算法你用到了哪些数据结构?
5、写几个题。
算法
1、m*n 矩阵,从(0,0) 走到 (m-1, n-1) 有多少种走法 右 下
最简单的,数学方式去实现,c(m, m+n),也是最优解
public static int process1(int[][] a){
int m = a.length;
if(m == 0){
//此时没法走
return -1;
}
int n = a[0].length;
//(0,0) -》 (m-1, n-1)
//比如(0,0)-》(1,1) 总共两部,右1步 下一步
int all = m + n;
//只需要计算 C(m, all) 即可
int up = all, down = m;
int fenzi = 1, fenmu = 1;
for(int i = 0; i < m; i++){
//分子 分母同时计算
fenzi = down * fenzi;
fenmu = up * fenmu;
up--; down--;
}
return fenmu / fenzi;
}
面试官希望不用数学方式,代码上怎么写?
//当前来到 i, j 位置
//目标:m, n
//返回:从(i, j)->(m, n)有多少种可能性?
public static int process(int i, int j, int m, int n){
if(i == m && j == n){
return 1;
}
//特别的边界,防止输入问题
if(i > m || j > n){
return 0;
}
int p1 = 0, p2 = 0;
//问有多少种可能的方式
if(i < m){
p1 = process(i+1, j, m, n);
}
if(j < n){
p2 = process(i, j+1, m, n);
}
return p1 + p2;
}
当然,暴力可以继续优化,比如加一个缓存:
public static int processCache(int i, int j, int m, int n, int[][] cache){
if(i == m && j == n){
return 1;
}
//特别的边界,防止输入问题
if(i > m || j > n){
return 0;
}
if(cache[i][j] != -1){
return cache[i][j];
}
int p1 = 0, p2 = 0;
//问有多少种可能的方式
if(i < m){
p1 = processCache(i+1, j, m, n,cache);
}
if(j < n){
p2 = processCache(i, j+1, m, n, cache);
}
cache[i][j] = p1 + p2;
return p1 + p2;
}
动态规划版本没写,感觉没必要,问题简单而且有数学上的最优解。
2、二叉树是不是一样的,即isSameTree
static class TreeNode{
int val;
TreeNode left, right;
public TreeNode(int v){
val = v;
}
}
public static void main(String[] args) {
TreeNode l1 = new TreeNode(10);
TreeNode l2 = new TreeNode(10);
l1.left = new TreeNode(20);
l2.left = new TreeNode(20);
System.out.println("期待是相同的,实际上"+isSameTree(l1, l2));
System.out.println("期待不一样,实际上 "+isSameTree(l1, null));
System.out.println("期待不一样,实际上 "+isSameTree(null, l1));
//todo 取决于怎么定义,空树空树是否认为一个
System.out.println("期待一样,实际上 "+isSameTree(null, null));
//l2 发生了修改
l2.right = new TreeNode(20);
System.out.println("期待不一样,实际上 "+isSameTree(l1, l2));
}
public static boolean isSameTree(TreeNode a, TreeNode b){
//边界
if(a == null && b == null){
return true;
}
if((a == null && b != null )||(a != null && b == null)){
return false;
}
//此时说明 两个都不是空树
return a.val == b.val && isSameTree(a.left, b.left) && isSameTree(a.right, b.right);
}
分享
分享一些,在反问阶段的收获:
1、态度。程序员压得住性子,有耐心解决问题。
2、对新知识保持好奇,积极学习。
与大家共勉~
#华为##华为面试##23届秋招笔面经#