⚠️ 每道题:关掉题解 → 白纸/空编辑器手写 → 跑通所有用例 → 才算过。
你不是初学者,你是手生。手生的唯一解药是手写,不是看题解。看懂题解会给你"我会了"的错觉,但面试是让你当场写,不是当场看。
你不是初学者,你是手生。手生的唯一解药是手写,不是看题解。看懂题解会给你"我会了"的错觉,但面试是让你当场写,不是当场看。
✅ 独立写出并跑通
🔴 卡住看了提示
❌ 完全不会
🔥 华为/大厂机试高频
Python 手写提醒三个月没写,这些最容易忘
# 1. 哈希表 / 计数
from collections import defaultdict, Counter
d = defaultdict(int) # d[k] 默认 0,不用先判断 key 在不在
cnt = Counter(nums) # 直接统计词频,返回 {元素: 次数}
# 2. 队列(BFS 必用,别用 list.pop(0),那是 O(n))
from collections import deque
q = deque()
q.append(x); q.popleft() # 两端都是 O(1)
# 3. 堆(默认小顶堆,要大顶堆就存负数)
import heapq
heapq.heappush(h, x); heapq.heappop(h)
heapq.heapify(nums) # 原地建堆
# 大顶堆:push 时存 -x,pop 出来再取负
# 4. 排序带 key
arr.sort(key=lambda x: (x[0], -x[1])) # 第一维升序,第二维降序
intervals.sort(key=lambda x: x[0]) # 区间按左端点
# 5. 二分(手写模板,左闭右闭,固定这一套别换)
def bisect(nums, target):
l, r = 0, len(nums) - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] == target: return mid
elif nums[mid] < target: l = mid + 1
else: r = mid - 1
return l # 插入位置
# 或直接用标准库
import bisect
bisect.bisect_left(nums, x) # 第一个 >= x 的位置
bisect.bisect_right(nums, x) # 第一个 > x 的位置
# 6. 链表节点(自己写时的定义)
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
# 反转链表三指针模板(背下来):
def reverse(head):
prev = None
while head:
nxt = head.next
head.next = prev
prev = head
head = nxt
return prev
# 7. 二叉树 DFS 递归骨架
def dfs(node):
if not node: return
# 前序位置
dfs(node.left)
# 中序位置
dfs(node.right)
# 后序位置
# 8. 网格 DFS 骨架(岛屿类,华为高频)
def dfs(grid, i, j):
if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] != '1':
return
grid[i][j] = '0' # 标记已访问(原地改,省 visited 数组)
dfs(grid, i+1, j); dfs(grid, i-1, j)
dfs(grid, i, j+1); dfs(grid, i, j-1)
# 9. 回溯骨架
def backtrack(path, choices):
if 满足结束条件:
res.append(path[:]) # 注意是拷贝 path[:],不是 path
return
for c in choices:
path.append(c) # 选择
backtrack(path, 新choices)
path.pop() # 撤销
# 10. 无穷大 / 常用
float('inf'), float('-inf')
ans = [[0]*n for _ in range(m)] # 二维数组,别用 [[0]*n]*m(浅拷贝坑!)
⚠️ 最后一个 Python 坑:
[[0]*n]*m 是错的,每一行是同一个引用。二维数组永远用 [[0]*n for _ in range(m)]。
进度速览刷到阶段二结束(约 45 题),大厂面试算法基本够用
| 阶段 | 题数 | 目标 | ✅ | 🔴 | ❌ | 完成率 |
|---|
刷完阶段二之后,每天保持 1-2 题维持手感即可,把时间还给项目准备和投递。