华为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届秋招笔面经#