华为OD C++/Java岗位两轮技术面面经(25届空挡一年)
《面试题目》
时间线:机考 → 综测 → HR资格面 → 技术一面 → 技术二面 → 综面
资格面试
- 考研情况?
- 考虑的地点?
- 空窗期情况?
- 学校成绩?
技术一面(C++,Java 面试官)
- 项目问答:项目干了什么?
- 线程同步。
- 二叉搜索树。
- ARP 协议。
- 算法(C++):旋转链表(右移 k 位)。给你一个链表的头节点 head,旋转链表,将链表每个节点向右移动 k 个位置。例如
1->2->3->4->5,k=2,结果为3->4->5->1->2。
技术二面(Java,Java 面试官)
- 项目问答:毕业设计相关。
- 算法(Java):反转字符串(LeetCode 344)。
- 算法(Java):统计字符数量。
综合面
- 意向地点。
- 介绍项目。
- 本科学的什么课。
因两轮面试语言不一致,需要重新开启复习流程,建议候选人提前确认面试语言再针对性准备。
《参考解析》
1. 旋转链表(右移 k 位)
思路:先遍历一遍链表求出长度 n,并将链表首尾相连成环;将 k 对 n 取模(避免 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 的无锁并发)。