1. 北航计算机复试上机:考什么,怎么考?
如果你正在准备北航计算机的复试,看到“上机”两个字,心里是不是有点发怵?别慌,我当年也是这么过来的。北航的上机考试,说白了,就是一场在限定时间内(通常是2-3小时)解决若干编程题目的实战。它不考你长篇大论的理论,就看你能不能把想法变成代码,并且代码要能跑通、跑对。
很多同学容易陷入一个误区:觉得要把《算法导论》从头到尾啃一遍才行。其实不然。从历年的真题来看,北航的考察重点非常明确,就是经典算法思想和基础数据结构的灵活运用。题目可能披着“八皇后”、“三叉树”、“空闲块管理”这些看起来有点唬人的外衣,但内核无非就是递归、回溯、动态规划、深度/广度优先搜索(DFS/BFS),以及对数组、链表、栈、队列、树这些结构的熟练操作。
这场考试考察的是你的问题建模能力和代码实现能力。给你一个现实问题(哪怕是简化过的),你能不能快速抽象出背后的数据模型?能不能选择合适的数据结构和算法去解决它?写代码时,边界条件考虑周全了吗?会不会因为一个数组越界或者递归栈溢出而丢分?这些都是老师通过机试想看到的。
所以,备考的策略不是盲目刷遍所有LeetCode难题,而是精研真题,掌握套路。把一道经典题目的多种解法、各种坑都吃透,远比浅尝辄止地做一百道题有用。接下来,我们就一起拆解几道极具代表性的真题,看看如何把复杂的题目,拆解成你熟悉的基本功。
2. 经典算法思想实战拆解
算法是程序的灵魂,上机题就是灵魂的试金石。北航真题里,有几类算法思想是反复出现的,掌握了它们,你就拿到了大半的分数。
2.1 递归与回溯:以“八皇后”问题为例
八皇后问题是递归与回溯的“教科书级”案例。题目要求输出第b个皇后串,这其实增加了一个排序输出的要求,但核心解法不变。
核心思想:递归就是“自己调用自己”,回溯则是“试错了就回头”。我们可以把放置皇后想象成在一个8x8的棋盘上,一行一行地放置。在第row行,我们尝试在每一列(col)放置一个皇后。放置前,必须检查这个位置是否安全:即同一列、同一左对角线(行号-列号为常数)、同一右对角线(行号+列号为常数)上都没有其他皇后。
如果安全,我们就在这个位置放下皇后,然后递归地去处理第row+1行。如果第row+1行及其之后的所有行都能成功放置(递归返回成功),那么当前这个放置方案就是可行的。如果后续某一行所有列都放不了(递归返回失败),我们就“回溯”:撤销在第row行当前列的放置,尝试下一列。
代码框架与关键点:
def solve_n_queens(n):
def is_safe(board, row, col):
# 检查同一列
for i in range(row):
if board[i] == col:
return False
# 检查左对角线和右对角线
if abs(board[i] - col) == abs(i - row):
return False
return True
def backtrack(row, board, solutions):
if row == n: # 所有行都放置成功,找到一个解
# 将棋盘状态转换为题目要求的“皇后串”
solutions.append(''.join(str(col+1) for col in board))
return
for col in range(n):
if is_safe(board, row, col):
board[row] = col # 放置皇后
backtrack(row + 1, board, solutions) # 处理下一行
# 回溯:board[row]会被新的col值覆盖,无需显式撤销
solutions = []
# board[i]的值表示第i行的皇后放在了第几列
board = [-1] * n
backtrack(0, board, solutions)
return solutions
实战技巧:
- 存储解:不需要真的维护一个二维棋盘。用一个一维数组
board,board[row]=col就表示第row行的皇后放在第col列,检查冲突时非常高效。 - 对角线判断:这是关键。左对角线(从左上到右下)上,行号与列号的差是常数;右对角线(从右上到左下)上,行号与列号的和是常数。利用这个特性可以快速判断。
- 排序输出:题目要求按“皇后串”视为整数的大小排序。我们生成的
solutions列表,因为递归和循环的顺序,天然就是按字典序(也即整数从小到大)生成的,直接取第b-1个即可(注意索引从0开始)。
这道题吃透了,递归回溯的思维模式就基本建立了。遇到“全排列”


238

被折叠的 条评论
为什么被折叠?



