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

相关推荐

玉无心❤️:发照片干啥 发简历啊
点赞 评论 收藏
分享
葬爱~冷少:我当时都是上午刷力扣,下午背八股,有活给我先别急,没活就干自己的事情
点赞 评论 收藏
分享
评论
4
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务