碎碎念

今天是圣诞节?虽然我一般不过这节日,但是还是祝大家节日快乐呀!大家今晚上把服务器端口都打开,防火墙关掉,有圣诞老人给服务器送礼物哦!(bushi)

终于考完喽!无论结果如何,我也已经尽力啦,100天连续的早起晚睡,身体上和精神上的压力都很大,无瑕更新,于是销声匿迹了这么久,终于考完了,却又感觉有一点空虚,总感觉天天没什么事情可以干,这就是空虚感吗?

在十月初,我参与了华为公司的第一批校招,经过三四轮面试后,也是成为了池子中的一条鱼,由于华为公司普遍战线拉的较长,我也不敢一直赌,于是另一边也在考研,中途HR也在一直打电话保温,我也在满怀期待。终于到了十二月初第一批开奖的环节,有幸被华为选上,最终签了三方。但是那时已经距离考研不足二十天,回想起前段时间的艰苦,我不愿意就此放弃,于是继续坚持了大概一个月时间,直到最近几天终于结束了,这两天有时间了,遂将华为面试过程(经验?)分享出来,希望对大家有用。

时间线

  • 9月25日:华为校招官网投递简历
  • 10月5日:添加HR微信
  • 10月12日:华为性格测试笔试
  • 10月16日:华为笔试
  • 10月22日:华为面试(一面,二面,主管面)
  • 10月26日:第一次电话保温
  • 11月13日:第二次电话保温
  • 11月21日:询问意向
  • 12月1日:收到小奖状
  • 12月3日:电话确认意向
  • 12月4日:武汉华为研究所线下签约

具体细节

个人情况

首先我是一个很菜的计算机学院小菜鸡,不过在学校担任了一些职务,在社交方面我还是有点自信哒!平时的爱好就是搞搞前端,算法方面虽然有涉及,但是并没有什么实质的成果(黑箱操作好难啊呜呜呜呜),所以技术上其实并没有什么很突出的表现,经过我的实测,华为公司也没有设置太高的技术门槛,所以大家放心就好啦!只要坚持,一定有结果!

华为的HR都很友好,有问必答的那种,所以自从10月5号开始,我就一直在不断的问HR问题哈哈,感谢HR的回复啦!

性格测试

从10月12日开始,简历经过了初筛,就正式进入了第一批的校招流程中,首先就是性格测试,其实各大厂商的性格测试都差不多,与其说是性格测试,倒不如说是服从性测试,比如一些常用的理解题,会给你一段文字,让你找出其中的关键句,或者图像辨析题,给四个非常抽象的图像,让你找出其中的不一样的图像,再就是一些性格题目,不能答的太快,后台会记录的,这些题可能有正确答案,也有可能没有正确答案,不过也是有淘汰率的哦!不要大意!大意失荆州!

性格测试实例

性格测试务必需要注意的几个点:

  1. 前后需要一致,因为会出现同样的题,如果你前后不一致次数太多,可能后台会有类似的记录导致挂在这里。
  2. 向着积极乐观的方向选择,不要整一些消极情绪在里面,面对困难,要敢于迎接挑战,而不是躲藏之类的。
  3. 不想当领导的士兵不是好士兵,但是这里需要反着来,不要刚进来就想着升官发财。

我能想到的只有这么多啦,具体就看你们自己的实际情况灵活选择咯!

技术笔试

技术笔试总共只有三道题,分别占比100,200,300分,只需要150分即可进面,听起来似乎很简单,但是题目还是有一定难度的,由于签了保密协议,无法把原题放上来,所以我就简单讲讲思路。

  1. 深度优先遍历

    判断两个点在矩阵中的最小距离,中间可能会有障碍物无法直接通过,需要找到最优路径,这里我才用了深度优先遍历的方法,其他的最短路径方法也是可以的,大家自行判断,下面是我的代码,已经过AI包装,与现场考试代码无关:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    from collections import deque

    def bfs(grid_rows, grid_cols, start, end, blocked_points):
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 上下左右方向向量
    queue = deque([start]) # 使用双端队列提高效率
    visited = set([start]) # 使用集合存储已访问点
    distance = 0

    while queue:
    for _ in range(len(queue)):
    x, y = queue.popleft()

    if (x, y) == end:
    return distance

    for dx, dy in directions:
    nx, ny = x + dx, y + dy
    if (0 <= nx < grid_rows and 0 <= ny < grid_cols and
    (nx, ny) not in visited and (nx, ny) not in blocked_points):
    visited.add((nx, ny))
    queue.append((nx, ny))

    distance += 1

    return -1 # 无法到达终点

    if __name__ == "__main__":
    # 输入网格大小
    grid_rows = int(input())
    grid_cols = int(input())

    # 起点与终点
    start = tuple(map(int, input().split()))
    end = tuple(map(int, input().split()))

    # 读取被阻止的点
    num_blocked = int(input())
    blocked_points = {tuple(map(int, input().split())) for _ in range(num_blocked)}

    # 计算最短距离
    result = bfs(grid_rows, grid_cols, start, end, blocked_points)
    print(result)
  2. 拓扑排序

    第二题需要实现的是拓扑排序,题目为会给你一些任务及其对应的依赖关系,询问你最快的完成所有任务的实现方式。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    from collections import deque

    def find_shortest_time(num_steps, step_times, dependencies):
    # 初始化最早完成时间和入度数组
    earliest_finish = [0] * num_steps
    in_degree = [0] * num_steps

    # 构建邻接表表示依赖关系
    adj_list = [[] for _ in range(num_steps)]
    for i in range(num_steps):
    if dependencies[i] != "-1":
    for dep in map(int, dependencies[i].split()):
    dep -= 1 # 转换为 0 索引
    adj_list[dep].append(i) # 添加边 dep -> i
    in_degree[i] += 1 # 增加入度

    # 初始化队列,包含所有入度为 0 的步骤
    queue = deque([i for i in range(num_steps) if in_degree[i] == 0])

    # 拓扑排序
    while queue:
    current = queue.popleft()
    current_finish_time = earliest_finish[current] + step_times[current]

    for next_step in adj_list[current]:
    earliest_finish[next_step] = max(earliest_finish[next_step], current_finish_time)
    in_degree[next_step] -= 1
    if in_degree[next_step] == 0:
    queue.append(next_step)

    # 返回最短完成时间
    return max(earliest_finish) + step_times[earliest_finish.index(max(earliest_finish))]

    if __name__ == "__main__":
    # 输入数据
    num_steps = int(input())
    step_times = list(map(int, input().split())) # 每个步骤的执行时间

    dependencies = [input() for _ in range(num_steps)] # 依赖关系

    result = find_shortest_time(num_steps, step_times, dependencies)
    print(result)
  3. 第三道题难度较大,题目我也忘记了,如果评价上面两道题为3星,第三道题我认为至少为5星,但是如果仅仅追求过线,前两道题抓到手已经足够了,后面的题目就是成绩越高越好,这样在面试能够更有优势。

总得来看其实题目难度并不算太难,至少过线基本上是可以做到的,华为公司主要看的是综合能力,而不单单是编程思维,会全方位考察的,所以大家不要有技术焦虑,如果有意向,大胆的投吧!

三次面试

由于面试是一天下午进行完成的,所以这里我就放在一起了,首先说一下具体感受,在我的三次面试中,我个人认为是非常轻松的,这个轻松与难度无关,而是实在气氛方面,华为的面试官非常和善,在面试过程中他会理解你的感受,带着你循序渐进,会尽量避免你的尴尬,这一点我要给满分,下面就是三四面试中的一些小细节了。

  1. 第一次面试

    这不仅仅是华为的第一次面试,这也是我的第一次面试,所以我是非常紧张的,两点开始,一点就坐在电脑面前等待,由于在学校,不太方便线下,所以华为采取了线上面试的方式,我个人感觉线上是比线下更为轻松的,但是还是仁者见仁啦,毕竟线下有更多的发挥空间。

    第一个面试官虽然也很和善,但是气场有点强大哈哈,一面进行的有点紧张,在面试的时候会问问你的项目呀,个人经历呀,还有,最重要的就是,笔试的题目,他会尝试用不同的方法来让你实现题目,这个不是现场手撕,但是需要对你笔试的题目有一定了解,表示你在下面是继续进行研究了的而不是考完就扔。

    第一次面试手撕的题目为回文判断,如asdfgfdsa,这个编程人应该都懂哈哈,下面是我的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    def longest_palindrome(s: str) -> str:
    if not s:
    return ""

    def expand(left: int, right: int) -> str:
    # 双指针向两边扩展,寻找最长回文
    while left >= 0 and right < len(s) and s[left] == s[right]:
    left -= 1
    right += 1
    return s[left + 1:right]

    max_palindrome = ""
    for i in range(len(s)):
    # 奇数长度回文
    palindrome1 = expand(i, i)
    if len(palindrome1) > len(max_palindrome):
    max_palindrome = palindrome1
    # 偶数长度回文
    palindrome2 = expand(i, i + 1)
    if len(palindrome2) > len(max_palindrome):
    max_palindrome = palindrome2

    return max_palindrome

    # 测试输入
    s = "abbaabcbaa"
    result = longest_palindrome(s)
    print(result)

    代码不再细讲,主要是表示一下现场手撕的难度,具体题目大家肯定是不一样的!

  2. 第二次面试

    第二次面试就比较有经验了,经过了第一次面试的训练,第二次面试中,面试官问到网站时,我主动将网站投屏了过来,讲解了一下我的技术栈,还有一些难点重点,不要认为这些很菜,面试官听的是你的过程,你只要能够完美的将你的内容讲解出来,那就已经很棒啦!

    再就是询问了我的一些项目,比如实习经历,实习的时候在干什么,负责什么内容,项目重点在哪里,你认为这个项目有什么应用前景,为什么要放这个项目等等。

    第二次手撕代码也不算是很高,甚至可以说是基础问题,就是寻找其中出现次数最多的单词,非常简单:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    def find_most_frequent(text):
    words = text.split()
    # 初始化字典
    word_counts = {}
    for word in words:
    if word in word_counts:
    word_counts[word] += 1

    else:
    word_counts[word] = 1
    print(word_counts)
    most_common_word = None
    max_count = 0
    for word, count in word_counts.items():
    if count > max_count:
    max_count = count
    most_common_word = word
    # print(most_common_word)
    return most_common_word

    s = input()
    result = (find_most_frequent(s))
    print(result)

    这里我用python撰写代码其实是占了一定的优势的,毕竟字典之类的是直接存在的,不需要我自己进行单独的定义,如果用C语言来写的话,可能需要定义一个结构体,但是也不算太难。

    经过二面大家应该能体会到,华为需要的是综合能力,而不单单是敲键盘的程序员,所以不要有技术焦虑,大胆冲锋!

  3. 主管面

    到了主管面,其实我个人是轻松很多的,因为主管面基本不考察技术,主要是考的灵活变通的能力,这个就要求大家自信发挥啦,主要还是前面的项目,自己讲明白,然后讲讲人生规划,为什么选择华为,在这个问题你还可以反问一些你认为合适的问题,但是比如什么太过功利性的问题就不要问了,会大大降低主管对你的印象分的。

整个面试流程就结束啦,主要其实就是面带微笑,保持自信就可以的!相信自己,哦哦哦哦哦~

保温流程

后面先后打了几次电话,无非就是询问一下意向呀,目标base呀,期望薪资呀,三方协议的签署情况呀,再就是上家给的薪水是多少,无非就是博弈论哈哈哈哈,这个也没什么说的,正常接电话就好,还是一样,不要说比如我已经找到工作了之类的话,主打一个谦虚谨慎,戒骄戒躁。

直到最后一次保温,询问了是否可以接受上海,我说可以,于是收到了口头offer。

小奖状

到了12月01日,很荣幸的,第一批接到了小奖状,一般拿到小奖状就稳啦,基本上没有毁约的先例。后面流程相关的走一下,通知12月06日在武汉华为研究所线下签约,和第三方签约,整个流程基本走完。

总结

总的来说,无论结果如何,首先整个流程下华为方给人的感觉都非常和蔼,哪怕流程拉的有点长,但是也一直有消息,不过泡池子也是必然的,这是每个人都过不去的坎,大胆投递!微笑面对,相信大家都可以的!

最终的聘书

同时也不要一棵树上一直等着,毕竟这个战线拉的确实有点长,等结果出来秋招基本上结束了,如果此时情况不理想,可能会导致没有offer的情况!

最后祝大家,都找到理想的offer!

番外

好烦呀!华为武研所拍的图片好像被我手贱给删掉了哇啊啊啊啊啊啊啊啊啊啊啊,这是一个悲伤的故事……