4. 数据结构与算法高频题

数据工程面试中,算法题常围绕链表、哈希表、二叉树、字符串、排序与动态规划展开。面试官不仅考察代码正确性,更关注数据结构选型、时空复杂度分析与边界条件处理。掌握通用回答框架,可以帮你在高压下稳定发挥。

审题 选数据结构 定算法 写代码 测试&优化 复盘 ⚠️ 注意:遗漏边界或扩容方向 → 挂掉 💡 加分:主动交流想法 + 优化空间/时间 输入/输出 / 边界 数组/哈希/链表/堆 双指针/递归/DP 变量命名 / 异常 用例 + 复杂度 对比方案

面试问答卡片

📌 题目:反转链表

面试问题请实现一个函数,输入一个单链表头节点,反转链表并返回新头节点。
考察点链表指针操作、迭代/递归思维、边界处理(空链表、单节点)
回答框架1) 明确链表定义 2) 迭代法:三个指针(prev/curr/next) 3) 循环终止条件 4) 返回新头 5) 复杂度 O(n)/O(1)
示例回答“我使用迭代法。定义 prev=null,curr=head,每次循环保存 next 指针,将 curr.next 指向 prev,然后移动 prev 与 curr。最后返回 prev 作为新头。时间复杂度 O(n),空间 O(1)。”
(60字)
可能追问递归实现?如何判断链表有环?如果要求原地反转且不允许修改节点值怎么做?
避坑提醒忘记更新 head 的 next 为 null 会造成循环链表;递归时注意栈溢出。

📌 题目:两数之和

面试问题给定一个整数数组 nums 和一个整数目标值 target,请找出和为目标值的两个整数,并返回它们的下标。
考察点哈希表应用、时空权衡、一题多解(暴力/哈希/排序+双指针)
回答框架1) 暴力枚举 O(n²) → 不推荐 2) 哈希表 O(n):遍历时查 complement = target - nums[i] 3) 返回索引 4) 注意不能重复使用同一元素
示例回答“我使用哈希表做一次遍历。遍历数组,检查 target − nums[i] 是否已在 map 中,若在则返回两个索引,否则将当前元素存入 map。时间 O(n),空间 O(n)。相比暴力更优。”
(78字)
可能追问如果数组有序怎么办?返回所有组合?如果有重复元素怎么处理?
避坑提醒返回索引而不是值;注意先检查 target − nums[i] 再存入当前元素(避免自己和自己配对)。

📌 题目:二叉树的层序遍历

面试问题给定一棵二叉树,请按层从上到下、从左到右返回节点值的二维数组。
考察点BFS 模板、队列使用、按层分组技巧、空树处理
回答框架1) 空树返回 [] 2) 初始化队列,根入队 3) while 队列非空:记录当前层长度 len,遍历 len 次出队、收集值、入队子节点 4) 每层结果加入最终数组
示例回答“使用队列实现层序遍历。根节点先入队,while 循环中每轮先统计当前队列长度,弹出该长度个节点并记录值,同时将子节点入队。这样每轮对应一层。时间复杂度 O(n),空间 O(n)。”
(85字)
可能追问如何实现 zigzag 层序遍历?用 DFS 如何做?如果树非常大如何优化空间?
避坑提醒每层开始时一定要先记录当前队列大小,否则 pop 时队列长度会变化;注意子节点为空时不要入队。
💡 提升技巧: 面试时先口述思路(选什么数据结构、复杂度多少),再写代码。遇到卡壳时主动问面试官“是否需要考虑大数/内存限制?”,展示工程思维。