华为留学生校招过经【机考+两轮技术面+主管面】
楼主是本科通信,出国读研转码计算机的,基础稀巴烂,去年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告诉我在正式录用前大概会有一个多月的等待时间。搞定咯~~
#华为面试##华为##笔经##校招#