赵宇 · 华为 软件开发工程师(应届,通用软件)面试押题与算法练习

意向地:杭州 / 上海 / 南京 · 部门:半导体业务部、图灵业务部 · 笔试已于 10 月 14 日完成 · 生成日期 2026-10-26

流程:机考 → 综合测评 → 技术一面 → 技术二面 → 主管面 手撕题:每轮技术面 1 道,LeetCode 简单~中等,20~30 分钟,本地 IDE 跑通 练习进度自动保存在本机浏览器

这份 JD 在考什么

岗位职责 → 面试映射

JD 原文面试里会怎么出现
需求分析、方案设计、代码开发、静态检查、单元测试、本地构建、集成测试、问题定界定位手撕题要求代码规范 + 边界处理 + 能解释复杂度;八股会问单测怎么写、静态检查工具、Git 工作流
组件/模块看护与重构,提升可维护性、可扩展性、可测试性设计模式、重构原则(单一职责、依赖倒置)、怎么给老代码补测试
后端故障诊断和项目支持排障方法论:日志 → 指标 → 链路;CPU 飙高、内存泄漏、接口超时怎么定位。你的美团 realtime-optimizer 和星环慢 SQL 监控是现成素材
智能化演进,AI 应用、AI 智能体RAG 流程、NL2SQL 的坑、Agent 的 tool-calling 与评测、用过哪些 AI 编程工具(面经里已经被问到)
优选:TCP/IP、分布式、云化、容器化、HarmonyOSTCP/UDP 区别、三次握手、CAP、Kafka/Flink 的一致性、Docker/K8s 基础概念

华为技术面的真实风格(来自 2025~2026 面经)

  • 每轮技术面一道手撕题,以 LeetCode 简单~中等为主:反转字符串、岛屿数量、矩形重叠面积、删除有序数组重复项、二叉树最大宽度、多字符串最长公共子串。
  • 面试官不换题而是沿一个知识点连续追问,例如从"岛屿数量用了 DFS"追到"这算 BFS 还是 DFS、递归深度多少会爆栈、怎么改迭代"。
  • 手撕之后常问:换一种解法、复杂度能否更优、空数组/单元素/负数/含空格字符串怎么处理。每道高频题准备两种解法。
  • 项目追问占一半以上时间,问法是"你具体做了什么、遇到什么问题、怎么解决、效果怎么量化"。
  • 主管面几乎不问技术:加班态度、城市意向、稳定性、分歧处理、逻辑题。
你的最大风险:简历是数据开发(Flink/Spark/数仓)背景,投的是通用软件。面试官一定会问"为什么投通软""Java/工程能力怎么样""写过服务端、单测、CI 吗"。第 ⑤ 页专门准备这个。

10 天备考计划(每天 2 小时)

Day算法专题(第②页对应题)八股/项目(第④⑤页)
1哈希与数组:两数之和、字母异位词分组、最大子数组和、多数元素进程/线程/协程、IPC 方式、虚拟内存
2双指针与滑动窗口:无重复最长子串、三数之和、盛水、接雨水、长度最小子数组TCP/UDP、三次握手四次挥手、HTTP 1.1/2
3栈:有效括号、字符串解码、每日温度、移除 K 位数字、括号内翻转MySQL 索引/事务隔离/binlog、Redis 缓存
4链表:反转、环、相交、合并、LRU(手写双向链表)Java 集合/并发(HashMap、ConcurrentHashMap、volatile、线程池)
5树:层序遍历、最大宽度、最大深度变体、公共祖先设计模式:单例(手写)、工厂、策略、观察者;重构原则
6BFS/DFS 网格:岛屿数量、岛屿周长、最大岛屿、矩阵最长递增路径美团 realtime-optimizer:16 模式、4 维诊断背熟
7回溯:全排列、组合、复原 IP、最大合法时间NL2SQL / RAG 流程、评测方法、幻觉治理
8DP:爬楼梯、零钱兑换、单词拆分、LIS、最长公共子串、分月饼Flink 项目:Watermark 停滞排障讲 3 分钟版本
9贪心与排序:合并区间、最大数、分发糖果、救生艇、加油站、跳跃游戏、手写快排、第 K 大排障方法论、单测/静态检查/CI 话术
10用第⑦页随机抽 5 题限时模拟,每题 25 分钟,口述思路再写主管面问题逐条过一遍,逻辑题练 3 道

手撕算法押题(按华为面经出现频次排序)

频次来源:1148 篇华为面经统计的 Top20、掘金汇总的华为手撕星级榜、牛客 2025~2026 通软/AI/嵌入式面经。 ★★★★★ = 多来源高频必做;★★★★ = 高频;★★★ = 常见;★★ = 近期面经出现或华为原创。参考代码为 Python,面试时用你最熟的语言(Java 也可以),关键是先口述思路再写。

华为机考题型分布(校招 3 题 / 100+200+300 分 / 120 分钟)

笔试已经考过,这一页留作面试官问"笔试做得怎么样、哪题没做出来"时的复盘,以及二面可能临时出一道机考风格题时的模板库。按测试用例通过率给分,暴力解也要先交。

一星题(100 分)高频考点

考点占比代表题
字符串处理 / 模拟约 30%IP 地址分类、日志异常检测、失灵键盘、十六进制协议帧解析、8 位 LED 控制器、电池充电时间
多关键字自定义排序约 25%分辨率排序、按频次再按字典序排序、按票数和字母序输出(LC 937)
哈希统计高热点网站统计、日志 ID 频次、命令失败统计、数组去重
栈 / 队列 / 单调栈中编辑器撤销重做、流量波峰、下一个更大元素、打印文件(优先队列)
简单贪心 / 位运算中最优优惠券、不重叠区间分配、二进制等距判断
滑动窗口 / 前缀和中基站低能耗时段统计、颜色反转

二星 / 三星题(200~300 分)高频考点

考点代表题
动态规划(最高频)两个字符串最短路径(编辑距离变体)、组装最大可靠性设备(背包)、零食奖励、点亮战争迷雾(树形 DP)
BFS / DFS上班之路、最大岛屿体积、抗洪救灾、机器人活动区域、WIFI 设备网络规划、连通区域最大值(2026-10-21 机考)
拓扑排序模块构建顺序、有向网络头尾节点、字典序最小合法顺序
二分答案员工派遣、最佳植树距离(最小值最大化 / 最大值最小化)
单调栈 / 贪心删除重复数字后最大数字、最大股票收益、贪心的商人
并查集 / 区间合并路灯照明、区间染色后最长连续段(2026-10-21 机考)
复杂模拟信道分配、卡牌游戏回合、环形内存访问、数字拼接求最小差值
常见丢分:输入解析错(尤其十六进制和复杂分隔)、空数组 / n=1 / 溢出未处理、暴力超时。整数一律用 64 位。

必背模板(ACM 模式)

Python 输入输出模板
import sys
def main():
    data = sys.stdin.read().split()        # 一次读完,按空白切分
    it = iter(data)
    n = int(next(it))
    arr = [int(next(it)) for _ in range(n)]
    # 按行读取时:lines = sys.stdin.read().splitlines()
    print(solve(n, arr))

def solve(n, arr):
    return sum(arr)

if __name__ == "__main__":
    main()

把核心逻辑和 I/O 分开写,面试官看得清楚,也方便口述。Java 用 BufferedReader + StreamTokenizer,避免 Scanner 超时。

多关键字排序(LC 937 风格)
# 按出现次数降序,次数相同按字典序升序
from collections import Counter
cnt = Counter(words)
res = sorted(cnt.items(), key=lambda kv: (-kv[1], kv[0]))
# 分辨率排序:按宽*高降序,相同按宽降序
res = sorted(items, key=lambda s: (-(s[0]*s[1]), -s[0]))
网格 BFS(最短路 / 连通块)
from collections import deque
def bfs(grid, sr, sc):
    m, n = len(grid), len(grid[0])
    dist = [[-1]*n for _ in range(m)]
    q = deque([(sr, sc)]); dist[sr][sc] = 0
    while q:
        r, c = q.popleft()
        for dr, dc in ((1,0),(-1,0),(0,1),(0,-1)):
            nr, nc = r+dr, c+dc
            if 0 <= nr < m and 0 <= nc < n and grid[nr][nc] != '#' and dist[nr][nc] == -1:
                dist[nr][nc] = dist[r][c] + 1
                q.append((nr, nc))
    return dist
并查集
class DSU:
    def __init__(self, n):
        self.p = list(range(n)); self.sz = [1]*n
    def find(self, x):
        while self.p[x] != x:
            self.p[x] = self.p[self.p[x]]   # 路径压缩
            x = self.p[x]
        return x
    def union(self, a, b):
        a, b = self.find(a), self.find(b)
        if a == b: return False
        if self.sz[a] < self.sz[b]: a, b = b, a
        self.p[b] = a; self.sz[a] += self.sz[b]
        return True
拓扑排序(Kahn,字典序最小用堆)
import heapq
def topo(n, edges):
    g = [[] for _ in range(n)]; indeg = [0]*n
    for u, v in edges:
        g[u].append(v); indeg[v] += 1
    h = [i for i in range(n) if indeg[i] == 0]; heapq.heapify(h)
    order = []
    while h:
        u = heapq.heappop(h); order.append(u)
        for v in g[u]:
            indeg[v] -= 1
            if indeg[v] == 0: heapq.heappush(h, v)
    return order if len(order) == n else None   # None 表示有环
二分答案(最小值最大化)
def max_min_gap(pos, k):          # 在 pos 中选 k 个点,使最小间距最大
    pos.sort()
    def ok(d):                    # 间距 >= d 时能否放下 k 个
        cnt, last = 1, pos[0]
        for x in pos[1:]:
            if x - last >= d:
                cnt += 1; last = x
        return cnt >= k
    lo, hi = 1, pos[-1] - pos[0]
    while lo < hi:
        mid = (lo + hi + 1) // 2
        if ok(mid): lo = mid
        else: hi = mid - 1
    return lo
01 背包 / 完全背包
def knap01(W, items):             # items: [(weight, value)]
    dp = [0]*(W+1)
    for w, v in items:
        for c in range(W, w-1, -1):          # 倒序:每件一次
            dp[c] = max(dp[c], dp[c-w] + v)
    return dp[W]

def knap_complete(W, items):
    dp = [0]*(W+1)
    for w, v in items:
        for c in range(w, W+1):              # 正序:可重复
            dp[c] = max(dp[c], dp[c-w] + v)
    return dp[W]
单调栈(下一个更大元素)
def next_greater(nums):
    res = [-1]*len(nums); st = []
    for i, x in enumerate(nums):
        while st and nums[st[-1]] < x:
            res[st.pop()] = x
        st.append(i)
    return res

八股押题

打 ★ 的是 2025~2026 华为通软 / 嵌入式 / Java 面经里被明确问到的原题。每条后面给出面试官的追问链,准备时按链条往下想两层。

操作系统

★ 进程和线程的区别? 追问链:
资源与调度单位→线程共享什么、独占什么(栈、寄存器、TLS)→切换成本为什么不同(页表、TLB)→协程 / 用户态线程
★ 进程间通信方式? 管道、消息队列、共享内存、信号量、信号、Socket。追问:共享内存为什么最快、怎么同步;Kafka 算不算 IPC。
★ 计算机内存结构 / 虚拟内存?(有候选人没答出来)寄存器 → L1/L2/L3 → 内存 → 磁盘;虚拟地址到物理地址的映射、页表、缺页、TLB。进程地址空间:代码段、数据段、堆、栈、mmap 区。
★ 内存泄漏怎么定位? Java:堆 dump + MAT 看支配树、常见原因(静态集合、未关闭资源、ThreadLocal、监听器);C/C++:Valgrind、ASan。要能结合你 Flink 作业状态膨胀的例子说。
死锁的四个条件与避免? 互斥、占有且等待、不可抢占、循环等待;按序加锁、超时、银行家算法。

计算机网络(JD 优选项)

★ TCP 和 UDP 的区别与适用场景?UDP 能做可靠传输吗? 追问链:
面向连接/可靠/有序/流量拥塞控制→UDP 上层实现可靠:序号、ACK、重传、滑窗(QUIC、KCP)→为什么 QUIC 选 UDP
三次握手四次挥手?为什么三次、为什么 TIME_WAIT? 追问:大量 TIME_WAIT 怎么办;SYN 泛洪。
★ HTTP 1.0 / 1.1 / 2 的区别? 长连接、管线化、多路复用、头部压缩、服务端推送;HTTPS 握手过程。
浏览器输入 URL 后发生了什么? DNS → TCP → TLS → HTTP → 渲染,每一步能展开一句。

数据结构与算法基础

★ 数组和链表的区别,哪个读取快,为什么? 连续内存、缓存局部性、随机访问 O(1) vs O(n);插入删除反过来。
★ 树的分类?二叉树、平衡树、搜索树各是什么? BST → AVL / 红黑树(为什么工程用红黑树)→ B / B+ 树(为什么数据库用 B+)。
★ 字典树了解吗? 前缀匹配、敏感词过滤;二面手撕"最长匹配前缀替换"就是它。
★ 知道哪些排序算法?快排最坏情况?稳定性? 手写快排是华为原创高频题,见第②页。追问:三路快排、随机 pivot、为什么 Java 对基本类型用双轴快排、对对象用归并(TimSort)。
★ BFS 和 DFS 的区别与适用? 最短路用 BFS;递归深度爆栈怎么改迭代。
哈希表原理?冲突怎么解决? 拉链、开放寻址、扩容 rehash;HashMap 链表转红黑树阈值 8。

Java(你简历里 Flink / Spring Boot 都是 Java)

★ HashMap 线程安全吗?线程安全的集合有哪些?ConcurrentHashMap 用悲观锁还是乐观锁?乐观锁怎么实现? 追问链:
HashMap 并发 put 的问题→ConcurrentHashMap 1.8:CAS + synchronized 桶级锁→CAS 的 ABA 问题→volatile 的可见性与禁止重排
★ final 的用法?多态解决了什么问题?深拷贝与浅拷贝?
★ GC 算法有哪些?JVM 内存分区? 标记清除/复制/标记整理、分代、G1 的 Region;什么对象进老年代;Full GC 怎么排查。
线程池参数和执行流程? 核心线程 → 队列 → 最大线程 → 拒绝策略;嵌入式面经里要求当场手写线程池,Java 岗了解 ThreadPoolExecutor 七个参数即可。
★ Spring 事务隔离级别与传播行为? 配合 MySQL 隔离级别一起答。

数据库与缓存

★ 用过哪些数据库?MySQL 索引为什么用 B+ 树?事务隔离级别? 追问:可重复读怎么实现(MVCC + 间隙锁)、幻读。
★ binlog 的作用? 主从复制、数据恢复;你简历 Maxwell / Flink CDC 就是消费 binlog,可以顺势展开 CDC 原理,这是你的主场。
★ 为什么用 Redis?缓存机制?在 Java 里怎么配置? 缓存穿透/击穿/雪崩、过期策略、持久化 RDB/AOF;简历里 Redis 做维表缓存,要能说命中率和 TTL 怎么定。
SQL 调优怎么做? explain、索引覆盖、避免函数作用在索引列;你在星环做过慢 SQL 监控,直接讲案例。

设计模式与工程能力(对应 JD 看护重构)

★ 项目中用过哪些设计模式?举例。 策略(16 种优化模式的匹配)、模板方法(三阶段流水线)、观察者(Flink 侧输出流 / Kafka 消费)、建造者(Flink 算子链配置)。
★ 手写单例(volatile 双重检查) 见第②页 #45。
怎么提升代码的可维护性 / 可测试性? 单一职责、依赖注入便于 mock、接口隔离、圈复杂度;单测用 JUnit + Mockito,Python 用 pytest;静态检查用 SonarQube / Checkstyle / SpotBugs。
★ 代码中如何体现安全性? 输入校验、参数化 SQL 防注入、敏感信息不入日志、最小权限、依赖漏洞扫描。NL2SQL 项目里"只读账号 + SQL 白名单校验"是现成例子。
后端接口超时 / CPU 飙高 / OOM 怎么排查? 一条排障链:现象 → 指标(QPS、RT、GC)→ 日志 → 线程栈 / 堆 dump → 定位 → 回滚或热修 → 复盘。套用你 Flink 反压定位的四维诊断。

AI 应用与智能体(JD 第 4 条,必问)

★ 用过哪些 AI 编程工具?怎么用的? 说清工具名、用在哪一步(生成单测、读陌生代码、写正则)、怎么校验它的输出。不要说"全靠它写"。
RAG 的流程?怎么评估效果? 切分 → 向量化 → 召回 → 重排 → 生成;评估:召回率、答案忠实度、人工抽检;常见问题:切分粒度、召回噪声、长上下文。
NL2SQL 怎么做的?准确率怎么保证? Schema 裁剪、few-shot、SQL 校验执行回退、指标口径固化。你美团无人车数仓智能问数是主素材。
什么是 Agent?和普通调用大模型的区别? 规划 + 工具调用 + 记忆 + 反思;realtime-optimizer 的"元数据采集 → 指标分析 → 匹配优化模式"就是一个工具型 Agent,这样讲能把数据开发经历转成 JD 第 4 条。
大模型幻觉怎么治理? 约束输出格式、引用溯源、执行验证、置信度阈值 + 人工兜底。

分布式 / 云化 / 容器化(优选项,答到概念即可)

CAP 与一致性?Kafka 如何保证不丢不重?Flink 的 exactly-once? 这三题是你的强项,主动往这里引。
Docker 镜像与容器的区别?K8s 里 Pod / Deployment / Service 是什么? 星环实习处理过"组件 Pod 不可用",可以讲排查过程。
HarmonyOS 了解吗? 不熟就坦诚说没开发过,知道它是分布式软总线、ArkTS、一次开发多端部署即可。

简历项目 → 通软 JD 的翻译

核心话术:"我做的是数据平台方向的后端开发"。Flink 作业、Spring Boot 服务、NL2SQL 服务都是后端软件;排障、重构、测试这些 JD 职责在数据平台里同样存在。不要让面试官觉得你只会写 SQL。
简历素材对应 JD 职责面试讲法(1 分钟版)必然追问
美团 · realtime-optimizer(反压定位、积压、SQL 改写;16 种优化模式、4 维诊断、三阶段流水线)③ 后端故障诊断 ④ 智能化演进(AI 智能体)把它讲成一个排障 Agent:输入作业元数据和指标,按四维诊断(资源 / 数据 / 算子 / 外部依赖)定位,再匹配 16 种优化模式输出建议。强调"把人工排障经验结构化成可复用工具"。把 16 种模式和 4 个维度逐条列出;怎么验证建议是对的;误判率多少。
美团 · 无人车数仓智能问数(NL2SQL)④ AI 应用Schema 裁剪 + few-shot + 生成 SQL 校验执行 + 结果回退;指标口径固化到语义层。准确率怎么测、测试集多大;错误 SQL 怎么兜底;为什么不直接 RAG 整个表结构。
Flink 实时数仓(CDC、Broadcast State、Interval Join、Doris、Spring Boot 服务层)① 全流程开发 ② 看护重构先说"骨架参考公开课程,三处是自己做的":Watermark 停滞排查、指标口径重梳、Doris 写入 + Spring Boot 服务层。为什么每秒几百条要上 Flink;既用 Maxwell 又用 Flink CDC;Spring Boot 服务层暴露了什么接口、怎么测。
Flink · 窗口延迟治理(低流量 Watermark 推进停滞)① 问题定界定位这是最有辨识度的排障故事:现象(窗口不触发)→ 假设(Watermark 没推进)→ 验证(Web UI 看各 subtask watermark)→ 根因(空闲分区)→ 修复(withIdleness / 并行度对齐)→ 回归验证。怎么确认不是数据本身没来;修复后怎么防止回退;有没有写成单测或告警。
星环 · 数据倾斜、Pod 不可用、慢 SQL 监控,核心任务缩短 20%③ 后端排障 ② 持续优化长尾 Task 定位 → 倾斜 key 加盐两阶段聚合 / Map Join;Pod 不可用的排查链(kubectl describe → 日志 → 资源限制)。20% 怎么量化的;慢 SQL 阈值怎么定;监控用什么实现。
名创 · 物化视图、增量加载,报表效率提升 30%② 可维护性与性能扫描量和 Shuffle 量减少是根因;增量的边界条件(迟到数据、回刷)怎么处理。增量加载出错怎么对账;物化视图过期策略。

六个必须提前准备的"身份"问题

1. 你是数据开发背景,为什么投通用软件? 不说"因为数据岗少"。方向:我做的本来就是数据平台的后端工程(服务、作业、排障、工具),通软岗能把工程面做得更宽;半导体 / 图灵业务部偏计算底层,数据处理和性能优化经验能用上。
2. Java 工程能力怎么样?写过多大的服务? 给具体数字:Spring Boot 服务层有几个接口、QPS 多少、怎么部署、测试怎么做。没有就老实说规模小,但把 Flink 作业的 Java 代码量和结构说清楚。
3. 单元测试、静态检查、CI 做过吗? 至少能说:JUnit/Mockito 或 pytest;Flink 的 MiniCluster 测试、Harness 测算子;SonarQube / Checkstyle;Git 分支策略。没做过的在面前补一个小 demo 比现场编强。
4. 对半导体业务部 / 图灵业务部了解多少? 面前查清这两个部门做什么(芯片相关软件、计算平台),准备一句"我理解这个部门的软件更偏底层和性能,我在数据链路做过的吞吐和延迟优化思路是通的"。
5. 笔试哪题没做出来?现在会了吗? 面试官可能看到你的机考成绩。复盘 10 月 14 日那三题,把没做出来的那道补会,面试时主动说"当时卡在 X,后来发现是 Y"。
6. 第二志愿数据科学工程师和这个岗冲突吗? 统一口径:两个岗位都围绕"数据 + 工程",第一志愿优先,不会因为拿到另一个就放弃。

主管面常见问题(2025~2026 面经原题)

稳定性与意向

  • 对华为了解多少?认同华为文化吗?(准备 2 句:以客户为中心、艰苦奋斗,加一个你自己的理解)
  • 意向城市杭州 / 上海 / 南京选哪个?为什么?能长期在这里发展吗?(家在哪、本科在哪会被一起问)
  • 怎么看加班?压力大怎么处理?(承认压力,用一个实习里赶交付的具体例子说明怎么应对,不要表演热情也不要流露抗拒)
  • 还会不会考研 / 读博?有没有别的 offer?期望薪酬?
  • 未来 3~5 年职业规划?
  • 本科和研究生成绩排名?

行为问题

  • 和同事 / 导师意见不一致怎么处理?结果如何?
  • 任务快到期发现问题做不完,怎么办?(先同步风险,再切分范围保核心,不要硬扛到最后一天)
  • 实习中最大的困难、挫折、难沟通的场景?
  • 自己的优缺点?平时怎么学习新技术?
  • 沙漠里迷路口渴,发现一口枯井和一个破碗,你怎么想?(考乐观和行动力:破碗说明有人来过、枯井可以往下挖或等雨)

逻辑题(主管面确实会出)

毛驴运胡萝卜:两城相距 50 km,有 100 根胡萝卜,每次最多驮 50 根,每走 1 km 吃 1 根,最多能运到多少根?

100 根要分两趟驮,前半段每前进 1 km 要走 3 趟(去、回、去),消耗 3 根。走到 x km 时剩 100 − 3x,当剩 50 根时只需一趟:3x = 50 → x ≈ 16.67,取整在 16~17 km 处中转。以 17 km 为例:剩 100 − 51 = 49,再走 33 km 吃 33 根,剩 16 根。答案 16(有的版本答 16.67)。

四人过河:过河用时 1、2、5、10 分钟,船每次最多两人,速度按慢的算,最短多久?

1 和 2 过去(2),1 回(1),5 和 10 过去(10),2 回(2),1 和 2 过去(2)。合计 17 分钟。关键是让两个最慢的一起过且不用再回。

两根不均匀香,每根烧完 1 小时,怎么量 45 分钟?

同时点燃 A 两头和 B 一头;A 烧完时(30 分钟)点燃 B 另一头,B 再烧 15 分钟烧完,共 45 分钟。

烧饼问题:烙饼每面 1 分钟,锅一次放 2 张,3 张饼最少几分钟?

3 分钟:第 1 分钟 A 正 B 正;第 2 分钟 A 反 C 正;第 3 分钟 B 反 C 反。

估算题:用随机函数估算 π(面经原题)

在单位正方形内随机撒点,统计落在四分之一圆内的比例 p,π ≈ 4p。追问:误差和采样数的关系(1/√n)。

逻辑题答不出不致命,主管看的是你有没有思路、会不会把问题拆开说。先复述题目,再说"我先考虑极端情况"。

随机抽题 · 限时模拟

模拟真实手撕:抽到题后先用 2 分钟口述思路和边界,再写代码。默认 25 分钟,写完再点"查看题解"对照。

25:00
点击"抽一题"开始。
由 HiveGPT 托管 · 举报