企业总结
使命:把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界。
愿景
- 近期:突破芯片、操作系统等卡脖子技术,实现核心软硬件自主可控,鸿蒙生态设备突破10亿台;
- 中期:以华为云和昇腾AI芯片为双引擎,服务全球百万企业的数字化和智能化转型;
- 长期:成为全球ICT领域最受尊重的领导者,用技术创新守护数字经济的未来。
1. 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为字符集大小
2. 操作系统中进程和线程的区别?线程间如何通信?
【回答思路】 华为重视计算机基础,进程/线程是必考知识点,要从概念、资源、切换代价三个维度对比。
- 本质区别:进程是资源分配单位,线程是CPU调度单位。
- 资源对比:进程独占地址空间,同一进程的线程共享堆、全局变量、文件描述符。
- 切换代价:进程切换需要切换页表(开销大),线程切换只切换寄存器/栈(开销小)。
- 线程通信方式:共享内存(需要同步)、信号量、互斥锁、条件变量、消息队列。
【回答示例】
进程与线程的本质区别:进程是操作系统资源分配的基本单位,每个进程有独立的虚拟地址空间、文件描述符、信号处理等资源,进程间相互隔离;线程是CPU调度的基本单位,同一进程内的线程共享进程的堆内存、全局变量和代码段,但各自拥有独立的栈和寄存器状态。
切换代价:进程切换需要切换页表(TLB失效,需重新建立地址映射),开销是微秒级;线程切换只需保存/恢复少量寄存器,开销比进程切换小1-2个数量级。
线程间通信方式:
- 共享内存:最快的通信方式,但需要用互斥锁(mutex)防止竞争条件;
- 互斥锁 + 条件变量:经典的生产者-消费者模型实现,条件变量用于等待某个条件成立(如队列非空);
- 信号量(Semaphore):控制多线程对共享资源的访问数量;
- 消息队列(Java中的BlockingQueue):线程安全的队列,解耦生产和消费,是实际工程中最常用的方式。
3. 计算机网络: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时主动方还能响应,防止旧连接的报文影响新连接。
4. 华为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;
}
// 时间复杂度 O(m+n),空间复杂度 O(1)
5. 数据库:MySQL的索引结构为什么用B+树而不是B树或红黑树?
【回答思路】 华为数据库岗/后端开发常考,要对比B+树、B树、红黑树在磁盘IO、范围查询、数据存储上的差异。
- B+树 vs B树:B+树非叶子节点只存索引,不存数据,因此节点更小,IO次数更少;B+树叶子节点形成有序链表,支持高效范围查询。
- B+树 vs 红黑树:红黑树是二叉树,高度高,磁盘IO次数多;B+树是多叉树,高度低(通常3-4层),适合磁盘预读。
- 聚簇索引 vs 非聚簇索引:InnoDB的聚簇索引叶子节点存整行数据,非聚簇索引叶子节点存主键值。
【回答示例】
B+树的核心优势:
- 非叶子节点只存索引,不存数据:每个节点可以存储更多索引项,树的高度更低(InnoDB中B+树高度通常为3-4层),磁盘IO次数更少。
- 叶子节点形成有序链表:支持高效的范围查询(如WHERE id BETWEEN 100 AND 200),只需找到起始叶子节点后顺序遍历即可,B树需要多次回溯。
- 磁盘预读友好:B+树节点大小通常设置为磁盘页大小(InnoDB默认16KB),一次IO读取一个完整节点,充分利用局部性原理。
与红黑树对比:红黑树是二叉树,高度约为log₂n(100万数据需要20层),每次查询需要20次磁盘IO;B+树是1200叉树(16KB/13字节≈1200),100万数据只需3层,IO次数大幅减少。
6. 华为OD算法题:岛屿数量(DFS/BFS)
【回答思路】 华为OD高频题,考察图的遍历,DFS和BFS两种解法都要掌握。
【回答示例】
// DFS解法
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) return 0;
int count = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == '1') {
count++;
dfs(grid, i, j);
}
}
}
return count;
}
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)(递归栈深度)
7. 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,后续通信用该密钥加密。
8. 什么是零拷贝(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%以上。
9. 你对华为的5G技术和鸿蒙生态有什么了解?
【回答思路】 华为特色题,考察你对公司核心技术方向的理解,展示你对行业前沿的关注。
- 5G核心技术:Massive MIMO、网络切片、边缘计算MEC。
- 鸿蒙生态:分布式架构、一次开发多端部署、万物互联。
- 个人结合点:说明你感兴趣的具体方向。
好的,我已经准备好回答你的问题了。看起来你是在华为技术面试/笔试环节中,需要我帮你分析华为技术面经中的题目或技术点。
你提到的“华为技术面经”中包含了5G核心技术、网络切片、鸿蒙OS生态、分布式软总线、鸿蒙OS的差异化特性(如设备协同、一次开发多端部署)等。这些内容看起来像是面试中可能会被问到的技术点或场景题。
请问你具体需要我帮你做什么?比如:
- 解析某个技术概念(如“鸿蒙分布式软总线”或“5G网络切片”) ”)
- 技术点对比(如“鸿蒙OS和Android/iOS在分布式能力上的区别”)
- 代码/架构设计(如“鸿蒙分布式软总线的实现原理”)
- 其他(如“华为技术面经中常考的技术栈”)
请告诉我你具体需要哪方面的帮助?我可以为你提供更聚焦的解答。