不管是校招还是社招,算法面试始终是程序员绕不开的坎。这篇文章梳理最核心的考点和解题策略。
一、数据结构核心考点
数组与链表
# 数组 — 连续内存,随机访问 O(1)
# 链表 — 节点+指针,插入删除 O(1)
# 经典题目:反转链表
def reverse_list(head):
prev = None
curr = head
while curr:
next_temp = curr.next
curr.next = prev
prev = curr
curr = next_temp
return prev栈与队列
- 栈:后进先出(LIFO),括号匹配、表达式求值
- 队列:先进先出(FIFO),BFS、消息队列
- 经典题目:有效的括号、用栈实现队列、滑动窗口最大值
哈希表
查找 O(1) 的神器。经典题目:两数之和、无重复字符的最长子串。
# 两数之和
def two_sum(nums, target):
seen = {}
for i, num in enumerate(nums):
complement = target - num
if complement in seen:
return [seen[complement], i]
seen[num] = i二叉树
# 三种遍历(递归版)
def preorder(root): # 根左右
if not root: return
print(root.val)
preorder(root.left)
preorder(root.right)
def inorder(root): # 左根右
if not root: return
inorder(root.left)
print(root.val)
inorder(root.right)
def postorder(root): # 左右根
if not root: return
postorder(root.left)
postorder(root.right)
print(root.val)二、算法核心考点
排序算法
- 快速排序:平均 O(nlogn),最坏 O(n²)——必须能手写
- 归并排序:稳定 O(nlogn),适合外部排序
- 知道何时用计数排序/桶排序
二分查找
def binary_search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1动态规划(DP)
面试高频考点。核心思想:把大问题分解为子问题,记录子问题的解避免重复计算。
经典题目:爬楼梯、最长递增子序列、背包问题、编辑距离。
三、面试策略
- 拿到题目先问清楚输入输出和边界条件
- 先说思路再写代码,让面试官跟上你的节奏
- 先暴力解再优化,展示你的思考过程
- 写完代码自己跑测试用例
- 分析时间空间复杂度
四、刷题推荐
- LeetCode Hot 100:面试最高频的题
- 剑指 Offer:经典且实用
- 按标签刷:数组 → 链表 → 树 → DP → 回溯
- 每道题至少想三种解法
算法面试不是考你聪明,而是考你准备。持续练习,保持手感,你一定能过。