华为留学生校招过经【机考+两轮技术面+主管面】

楼主是本科通信,出国读研转码计算机的,基础稀巴烂,去年11月才开始刷题,在北美找实习不太顺利,因此就想着先拿个华为的保底吧。
部门:数据存储与机器视觉产品线

时间线:1.26机考 - 2.10两轮技术面 - 2.11 主管面 - 2.14系统显示面试全部通过

一、机考【590/600分】

第一题很简单,考察哈希表的使用。题目给了几个门的编号,以及这个门能够通向的下一个门的编号,让你找到一个“只能进不能出的门”。
做法是先建立哈希表,然后遍历即可,很容易,10分钟不到搞定;

第二题是“被污染的蜂巢”,给你一个以正六边形为基本单位的“矩阵”,即为“蜂巢”;其中有的蜂巢被污染了,有的没有;题目让你找到有多少个没有被污染的成片的蜂巢。
此题本质是寻找连通块的个数,只不过邻节单位变成了六个,而非常见的上下左右四个。可以使用DFS、BFS来做。

第三题是一个围棋游戏,给你一个表示残局的矩阵,白子用1表示,黑子用2表示,其余空格用0表示;根据围棋规则,判断此局是黑方胜出还是白方胜出;
此题也是一个DFS/BFS就能解决的问题。只需要设一个辅助函数来统计黑子或白子的最大相连块的大小,比较哪一个更大即可。楼主因为用BFS更加熟练,所以就用BFS写的。注意此题统计黑子和白子的代码是可以复用的。
贴一下考场上写的代码,肯定有更优的写法,anyway~
package problem3;

import java.util.*;
import java.lang.*;

public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int[][] grid = new int[19][19];

        // build grid
        for (int i = 0; i < 19; i++){
            for (int j = 0; j < 19; j++) {
                grid[i][j] = scanner.nextInt();
            }
        }


        Result result = new Result();
        HashSet<Integer> visited = new HashSet<>();
        for (int i = 0; i < 19; i++){
            for (int j = 0; j < 19; j++){
                if (grid[i][j] == 1 && !visited.contains(i * 19 + j)){
                    bfs(i, j, grid, visited, true, result);
                }
                if (grid[i][j] == 2 && !visited.contains(i * 19 + j)){
                    bfs(i, j, grid, visited, false, result);
                }

            }
        }

        int maxArea1 = result.maxArea1;
        int maxArea2 = result.maxArea2;

        System.out.println(maxArea1);
        System.out.println(maxArea2);

        if (maxArea1 > maxArea2){
            System.out.println("white");
        }else if (maxArea2 > maxArea1){
            System.out.println("black");
        }else{
            System.out.println("equal");
        }




    }

    public static void bfs(int x, int y, int[][] grid, HashSet<Integer> visited, boolean isOne, Result result){

        Queue<Node> queue = new LinkedList<>();
        queue.offer(new Node(x, y));
        visited.add(x * 19 + y);
        int count = 0;

        while (!queue.isEmpty()){

            Node curt = queue.poll();
            count++;

            for (Node nb : getNb(curt.x, curt.y, grid)){

                if (visited.contains(nb.x * 19 + nb.y))
                    continue;

                queue.offer(nb);
                visited.add(nb.x * 19 + nb.y);

            }
        }
        if (isOne){
            result.maxArea1 = Math.max(result.maxArea1, count);
        }else{
            result.maxArea2 = Math.max(result.maxArea2, count);
        }

    }

    public static ArrayList<Node> getNb(int x, int y, int[][] grid){

        ArrayList<Node> nbs = new ArrayList<>();

        int[] deltaX = {0, 1, -1, 0};
        int[] deltaY = {1, 0, 0, -1};

        for (int i = 0; i < 4; i++){
            int newX = x + deltaX[i];
            int newY = y + deltaY[i];

            if (newX < 0 || newX >= 19 || newY < 0 || newY >= 19)
                continue;

            if (grid[newX][newY] != 1){
                continue;
            }

            nbs.add(new Node(newX, newY));


        }
        return nbs;
    }


}

class Result {

    int maxArea1;
    int maxArea2;
    public Result(){
        this.maxArea1 = 0;
        this.maxArea2 = 0;
    }

}

class Node{
    int x, y;

    public Node(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

最后第二题有百分之五testcase超时了,因此做最后的得分是 590/600,成功拿到面试;


二、 技术面

2.10上午第一轮技术面,上来先自我介绍,然后面试官问了我第一个科研项目(我的一作paper)的详细情况;问我有没有考虑到实际应用中的损耗,以及各种用量的衡量等等,我说我在paper里都理想化了,他说ok的,但是工作了之后很多项目都是要考虑实际生产中会遇到的问题,我疯狂点头。
然后问了一下我学习和科研里遇到困难会怎么解决,为什么本科学通信,但是现在要做软件开发,等等;这个流程大概持续了半个小时,聊起来感觉时间也过得很快。
接下来是手撕代码环节,我拿到的题目是“接雨水”,这个应该是还蛮常见的一道面试题,是LC上的一道hard,但是楼主惨就惨在听过这道题的名字但并!没!有!写过!!我当时拿到这题就想凉了;硬抗了五分钟没什么思路,然后就向面试官求救,面试官人特别好,给我很耐心的讲解了思路,然后我中途由于紧张,一个很简单的逻辑都写了半天(无语,还是要多找找人mock interview才行 T T,感觉面试的时候我的水平是平时刷题的40%)。虽然有点曲折但是还是30分钟内写完了。最后有一个反问环节,完了之后和面试官愉快道别。

2.10下午第二轮技术面,楼主这里是2.9晚上十点十五,面之前我已经精疲力竭,晚上十点谁还思考得动T T....加上第一轮觉得自己发挥的不太好,对二面就没啥信心了。二面一开始也是自我介绍,然后面试官挑了我的项目里他自己比较熟悉的领域,NLP相关,问了我一些数据处理上的细节,比如word embedding处理完的结果呀什么的,向量是多少维的;整体也不难。下面手撕代码,面试官给了两道题,让我自己选一道,由于第二题很长我理解起来都费劲所以就选了第一题,是一道一维数组的题目,我用了一个排序+滑动窗口,5分钟写出来了,谢天谢地,脑子还能转。同样,最后是反问环节。

三、主管面
主管面就是聊聊天,也是问了问项目的细节,然后问我为啥想要回国,期待的薪酬等等。相谈甚欢,感觉很稳。

之后HR告诉我在正式录用前大概会有一个多月的等待时间。搞定咯~~
#华为面试##华为##笔经##校招#
全部评论
一样的笔试题哈哈
1 回复 分享
发布于 2022-04-01 13:03
楼主拿到offer了么
1 回复 分享
发布于 2022-02-22 19:58
留学收获大不,我犹豫要不要留学
1 回复 分享
发布于 2022-02-16 12:53

相关推荐

评论
5
18
分享

创作者周榜

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