华为OD C++/Java岗位两轮技术面面经(25届空挡一年)

华为 · 华为OD(C++、Java开发) · 陕西 · 2026-05

《面试题目》

时间线:机考 → 综测 → HR资格面 → 技术一面 → 技术二面 → 综面

资格面试

  1. 考研情况?
  2. 考虑的地点?
  3. 空窗期情况?
  4. 学校成绩?

技术一面(C++,Java 面试官)

  1. 项目问答:项目干了什么?
  2. 线程同步。
  3. 二叉搜索树。
  4. ARP 协议。
  5. 算法(C++):旋转链表(右移 k 位)。给你一个链表的头节点 head,旋转链表,将链表每个节点向右移动 k 个位置。例如 1->2->3->4->5,k=2,结果为 3->4->5->1->2

技术二面(Java,Java 面试官)

  1. 项目问答:毕业设计相关。
  2. 算法(Java):反转字符串(LeetCode 344)。
  3. 算法(Java):统计字符数量。

综合面

  1. 意向地点。
  2. 介绍项目。
  3. 本科学的什么课。

因两轮面试语言不一致,需要重新开启复习流程,建议候选人提前确认面试语言再针对性准备。


《参考解析》

1. 旋转链表(右移 k 位)

思路:先遍历一遍链表求出长度 n,并将链表首尾相连成环;将 kn 取模(避免 k 大于 n 的无效旋转),找到新的尾节点位置(原链表第 n - k % n 个节点),在该位置断开环,得到新的头节点。时间复杂度 O(n),空间复杂度 O(1),是数组/链表旋转类问题的标准解法(成环 + 找断点)。

2. 反转字符串(LeetCode 344)

要求原地修改字符数组。经典解法是双指针:左右指针分别指向数组首尾,交换两端字符后向中间靠拢,直到左指针不小于右指针。时间复杂度 O(n),空间复杂度 O(1),是双指针技巧最基础的应用之一。

3. 统计字符数量

常见做法是用数组(如 int[26] 应对纯小写字母)或 HashMap<Character, Integer> 做计数:遍历字符串,对每个字符的计数加一。若问的是统计字符串中不同字符的种类数,则可用 Set<Character> 去重后取 size。该题考察的是基础的哈希计数能力,是高频通用知识点而非难题。

4. 线程同步常见方式

synchronized 关键字(JVM 内置监视器锁)、ReentrantLock(显式锁,支持公平锁、可中断、tryLock)、volatile(保证可见性和有序性,不保证原子性)、CountDownLatch/CyclicBarrier(线程协作工具)、Semaphore(信号量控制并发数)、Atomic* 系列(基于 CAS 的无锁并发)。