面经正文
OD机试真题:找出字符串中最长的不含重复字符的子串长度
回答思路
华为OD机试是上机考核,题型偏向数据结构与算法,滑动窗口是高频考点。
- 暴力解:枚举所有子串,O(n³),说完即可。
- 滑动窗口:双指针维护窗口 + HashMap记录字符位置,O(n)。
- 边界处理:空字符串、全相同字符、全不同字符。
回答示例
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
int maxLen = 0;
int left = 0; // 窗口左边界
for (int right = 0; right < s.length(); right++) {
char c = s.charAt(right);
if (map.containsKey(c) && map.get(c) >= left) {
left = map.get(c) + 1;
}
map.put(c, right); // 更新字符的最新位置
maxLen = Math.max(maxLen, right - left + 1);
}
return maxLen;
}
// 示例:"abcabcbb" → 输出3("abc")
// 时间复杂度 O(n),空间复杂度 O(min(m,n)),m为字符集大小
操作系统中进程和线程的区别?线程间如何通信?
回答思路
华为重视计算机基础,进程/线程是必考知识点,要从概念、资源、切换代价三个维度对比。
- 本质区别:进程是资源分配单位,线程是CPU调度单位。
- 资源对比:进程独占地址空间,同一进程的线程共享堆、全局变量、文件描述符。
- 切换代价:进程切换需要切换页表(开销大),线程切换只切换寄存器/栈(开销小)。
- 线程通信方式:共享内存(需要同步)、信号量、互斥锁、条件变量、消息队列。
回答示例
进程与线程的本质区别:
进程是操作系统资源分配的基本单位,每个进程有独立的虚拟地址空间、文件描述符、信号处理等资源,进程间相互隔离;线程是CPU调度的基本单位,同一进程内的线程共享进程的堆内存、全局变量和代码段,但各自拥有独立的栈和寄存器状态。
切换代价:
进程切换需要切换页表(TLB失效,需重新建立地址映射),开销是微秒级;线程切换只需保存/恢复少量寄存器,开销比进程切换小1-2个数量级。
线程间通信方式:
- 共享内存:最快的通信方式,但需要用互斥锁(mutex)防止竞争条件;
- 互斥锁 + 条件变量:经典的生产者-消费者模型实现,条件变量用于等待某个条件成立(如队列非空);
- 信号量(Semaphore):控制多线程对共享资源的访问数量;
- 消息队列(Java中的BlockingQueue):线程安全的队列,解耦生产和消费,是实际工程中最常用的方式。
计算机网络:TCP三次握手和四次挥手的过程,以及为什么是三次/四次?
回答思路
华为网络岗必考,要说清楚状态机(SYN/SYN-ACK/ACK),以及为什么握手三次够了、挥手为什么需要四次。
- 三次握手过程:SYN → SYN+ACK → ACK,双方确认各自的发送和接收能力。
- 为什么三次:两次不够(服务端无法确认客户端收到了自己的SYN),四次多余。
- 四次挥手过程:FIN → ACK → FIN → ACK,TCP是全双工,双方各自关闭。
- TIME_WAIT:主动关闭方需要等待2MSL,防止最后一个ACK丢失。
回答示例
三次握手流程:
- 客户端发送SYN(seq=x),进入SYN_SENT状态;
- 服务端收到后,发送SYN+ACK(seq=y, ack=x+1),进入SYN_RCVD状态;
- 客户端收到后,发送ACK(ack=y+1),双方进入ESTABLISHED状态,连接建立。
为什么是三次:
三次握手是建立可靠连接的最少次数。两次握手服务端无法确认客户端能接收数据;三次握手后,双方都确认了各自的发送和接收能力均正常。
四次挥手流程:
- 主动方发FIN(我没有数据发了),进入FIN_WAIT1;
- 被动方ACK(知道了,但我还有数据要发),进入CLOSE_WAIT;
- 被动方数据发完后,发FIN,进入LAST_ACK;
- 主动方ACK,进入TIME_WAIT(等待2MSL后进入CLOSED)。
为什么挥手四次:
TCP是全双工,关闭分为两个方向独立关闭,因此多出一次(第2步ACK和第3步FIN不能合并,因为被动方收到FIN时可能还有数据未发送完)。
TIME_WAIT等2MSL的原因:
确保最后一个ACK如果丢失,被动方重传FIN时主动方还能响应,防止旧连接的报文影响新连接。
华为OD算法题:合并两个有序链表
回答思路
链表题是华为OD高频,要能快速写出正确的递归和迭代两种解法,并分析复杂度。
回答示例
// 迭代法(推荐,空间复杂度O(1))
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1); // 哑节点简化边界处理
ListNode cur = dummy;
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
cur.next = l1;
l1 = l1.next;
} else {
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
cur.next = (l1 != null) ? l1 : l2; // 连接剩余部分
return dummy.next;
}
// 递归法
public ListNode mergeTwoListsRecursive(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
if (l1.val <= l2.val) {
l1.next = mergeTwoListsRecursive(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoListsRecursive(l1, l2.next);
return l2;
}
}
// 时间复杂度 O(m+n),空间复杂度 O(1)(迭代)或 O(m+n)(递归栈深度)
华为OD算法题:岛屿数量(DFS/BFS)
回答思路
图的遍历是高频考点,DFS/BFS是基本功。
- DFS/BFS:两种方法都要掌握,DFS代码更简洁。
- 标记访问:避免重复访问,将已访问的'1'改为'0'。
- 边界条件:数组越界、非岛屿('0')。
回答示例
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int numRows = grid.length;
int numCols = grid[0].length;
int numIslands = 0;
for (int r = 0; r < numRows; r++) {
for (int c = 0; c < numCols; c++) {
if (grid[r][c] == '1') {
numIslands++;
dfs(grid, r, c); // 发现一个岛屿,进行深度优先遍历
}
}
}
return numIslands;
}
private void dfs(char[][] grid, int i, int j) {
// 边界条件或不是陆地
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == '0') {
return;
}
grid[i][j] = '0'; // 标记已访问
dfs(grid, i + 1, j);
dfs(grid, i - 1, j);
dfs(grid, i, j + 1);
dfs(grid, i, j - 1);
}
// 时间复杂度 O(m*n),空间复杂度最坏 O(m*n)(递归栈深度)
HTTPS是如何保证传输安全的?证书校验的完整流程是什么?
回答思路
华为网安/通信岗常考网络安全,要说清楚TLS握手 + 证书链校验的完整流程。
- 对称加密 vs 非对称加密:为什么两者结合使用。
- 证书链校验:根CA → 中间CA → 服务器证书,三层验证。
- 校验内容:证书有效期、域名匹配、证书链完整、CRL/OCSP校验吊销状态。
回答示例
为什么HTTPS同时使用对称和非对称加密?
对称加密(AES)速度快,但密钥传输不安全;非对称加密(RSA/ECDHE)密钥传输安全,但计算速度慢。HTTPS在握手阶段用非对称加密交换会话密钥,后续通信用该密钥进行对称加密。
证书链校验完整流程:
- 浏览器内置根CA证书:如DigiCert Global Root,浏览器/操作系统内置,全球约200个;
- 服务器发送证书链:服务器返回服务器证书 + 中间CA证书(根CA不直接签服务器证书,因为根CA证书吊销影响太大);
- 浏览器校验证书链:
- 验证签名:用上级CA的公钥验证当前证书的签名,递归到根CA;
- 验证有效期:当前时间必须在证书的Not Before和Not After之间;
- 验证域名:证书的Subject Alternative Name(SAN)必须包含请求的域名;
- 检查证书吊销:查询CRL(证书吊销列表)或OCSP(在线证书状态协议),确认证书未被吊销。
- 会话密钥协商:证书校验通过后,用证书中的公钥加密发送Pre-master Secret,后续通信用该密钥加密。
什么是零拷贝(Zero-Copy)技术?Kafka为什么使用它?
回答思路
华为高性能网络/中间件岗考察,零拷贝是高性能数据传输的核心技术,Kafka是最典型的应用案例。
- 传统IO的问题:4次数据拷贝(磁盘→内核缓冲区→用户空间→Socket缓冲区→网卡)。
- 零拷贝实现:mmap(内存映射)/ sendfile(Linux系统调用)。
- Kafka的零拷贝:使用sendfile + DMA(直接内存访问),从磁盘到网卡只需1次拷贝。
回答示例
传统IO的数据拷贝次数:
读取一个文件并通过网卡发送,传统方式需要4次拷贝:
- 磁盘 → 内核缓冲区(DMA拷贝)
- 内核缓冲区 → 用户空间(CPU拷贝)
- 用户空间 → Socket缓冲区(CPU拷贝)
- Socket缓冲区 → 网卡(DMA拷贝)
加上2次上下文切换(用户态→内核态→用户态),开销巨大。
零拷贝技术:
- mmap(内存映射):将文件直接映射到用户进程的地址空间,省去步骤2,但步骤3仍然存在;
- sendfile(Linux 2.1+):在内核空间内直接将文件内容从磁盘缓冲区传到Socket缓冲区,配合DMA(直接内存访问,CPU不参与数据搬运),只需1次DMA拷贝。
Kafka在v0.9之后全面使用sendfile传输消息:
磁盘文件 → 内核缓冲区(DMA)→ Socket缓冲区(DMA)→ 网卡
Kafka为什么用零拷贝:
Kafka每秒处理百万级消息写入和读取,传统IO会成为瓶颈。使用sendfile零拷贝后,磁盘文件内容可以直接从PageCache(内核缓冲区)通过DMA传到网卡,无需经过用户空间,数据处理延迟降低60%以上。
你对华为的5G技术和鸿蒙生态有什么了解?
回答思路
华为特色题,考察你对公司核心技术方向的理解,展示你对行业前沿的关注。
- 5G核心技术:Massive MIMO、网络切片、边缘计算MEC。
- 鸿蒙生态:分布式架构、一次开发多端部署、万物互联。
- 个人结合点:说明你感兴趣的具体方向。
5G 核心技术
回答示例
我最关注的是网络切片——这是 5G 最有商业价值的架构级创新。通过同一物理网络基础设施,为不同行业客户(如车联网/远程医疗/工业互联网)按需提供独立的虚拟专网,每张切片可以拥有独立的 QoS 保障(时延/带宽/可靠性)和独立的管理平面。这对于华为 toB 业务来说是巨大的商业模式创新,不只是卖连接,而是卖“差异化连接服务”。
鸿蒙生态
回答示例
鸿蒙 OS 的核心差异化是分布式软总线——设备之间可以共享彼此的硬件能力(如手机的摄像头、扫地机器人的激光雷达),在应用层实现“设备间无感协同”。一次开发多端部署的特性(ArkUI 框架)解决了 Android/iOS 双端开发成本翻倍的问题,对于开发者吸引力很大。
个人兴趣方向
回答示例
我对华为在物联网(IoT)协议和边缘计算方向非常感兴趣,希望未来能参与到鸿蒙生态下的智能家居或车联网应用的开发中,将分布式系统的技术与真实的生活场景结合起来。
常见问题 FAQ
这篇面经适合准备华为技术岗2026届校园招聘面试的同学参考,尤其适合用来了解面试流程、常见问题、岗位考察重点和复盘方向。
通常会结合岗位要求考察专业基础、项目经历、业务理解、沟通表达和解决问题能力。建议结合面经中的题目,把自己的经历整理成可追问的案例。
可以先通读正文了解流程,再整理高频问题和回答思路,最后把答案替换成自己的项目、实习或校园经历,形成更真实的表达。
不建议直接背诵。回答思路更适合用来理解考察点,真正面试时应围绕自己的经历、岗位要求和现场追问灵活组织答案。




