Skip to content

数据结构·代码题解题套路

统考 408 的数据结构大题(第 41 题,通常 13 分)几乎固定考察算法设计。本页整理评分规则、答题模板与高频题型。

一、评分规则与答题结构

阅卷按三段式给分,缺一段会明显失分:

得分点分值占比要求
算法的基本设计思想约 1/3自然语言描述思路,说清做法与关键步骤
算法的实现(代码)约 1/2C / C++ 描述,伪代码亦可,不要求可编译
时间与空间复杂度约 1/6必须写,且要与自己的算法一致

答题要点

  • 先写思想再写代码。只写代码而没有思想描述,会直接扣掉三分之一。
  • 复杂度要写自己算法的真实复杂度,不要照抄题目里"要求 O(n)"就写 O(n)
  • 允许伪代码,但结构体定义、指针操作要写清楚,不能出现自造的库函数。
  • 时间不够时,宁可写一个 O(n2)正确算法,也不要写一个不完整的最优解。

二、通用答题模板

c
/* 1. 算法的基本设计思想
 *    (用自然语言写清:用什么数据结构、分几步、每步做什么、为什么正确)
 */

/* 2. 算法实现 */
typedef struct {
    ElemType data[MaxSize];
    int length;
} SqList;

int Algorithm(SqList *L, ...) {
    /* 边界检查 */
    if (L->length == 0) return 0;

    /* 主体逻辑 */

    return 1;
}

/* 3. 复杂度
 *    时间复杂度:O(n),因为只对数组做了一趟扫描
 *    空间复杂度:O(1),只使用了常数个辅助变量
 */

三、高频题型与核心思路

1. 线性表

题型核心思路复杂度
数组循环左移 p 位(2010)三次逆置:逆置前 p 个 → 逆置后 np 个 → 整体逆置O(n) / O(1)
两个等长有序序列的中位数(2011)双指针同步折半,每次砍掉一半O(logn) / O(1)
寻找主元素(2013)摩尔投票:候选 + 计数,再扫一遍验证O(n) / O(1)
最小未出现正整数(2018)用长度 n+1 的标记数组做桶标记O(n) / O(n)
删除所有值为 x 的元素快慢指针原地覆盖O(n) / O(1)

2. 链表

题型核心思路
判断是否有环、找入环点快慢指针相遇后,一指针回头结点同速再走
找倒数第 k 个结点(2009)双指针,前指针先走 k
两链表公共后缀(2012)先求长度差,长的先走差值,再同步比较
重排链表 L1,Ln,L2,Ln1(2019)找中点 → 后半逆置 → 交替归并
删除绝对值重复的结点(2015)辅助数组按 |data| 标记

链表题必查三点

① 是否带头结点;② 删除结点后要 free;③ 修改指针的顺序不能反(先接后断)。

3. 树与二叉树

题型核心思路
非递归遍历显式栈模拟;中序最常考
层序遍历 / 求宽度队列 + 记录每层结点数
求 WPL(2014)层序或递归累加 depth * weight
判断是否二叉搜索树中序遍历应严格递增
最近公共祖先顺序存储用下标折半;链式用递归回溯

4. 图

题型核心思路
判断是否为树DFS 一次遍历完且边数 =n1
拓扑排序判环入度为 0 入队,出队计数 <n 则有环
单源最短路BFS(无权)/ Dijkstra(正权)

5. 排序与查找

题型核心思路
快排 partition 的变形找第 k 小、荷兰国旗三向划分
归并的变形求逆序对数
折半查找变形找第一个 x 的位置,注意开闭区间

四、常见失分点

  1. 边界未检查:空表、单元素、i 越界,这些是阅卷重点。
  2. 头结点处理不一致:题干说"带头结点"却按不带头结点写。
  3. 复杂度写错:写了双重循环却标 O(n)
  4. 只写代码不写思想:直接损失约三分之一分值。
  5. 使用了不存在的函数:如自造 sort()length(),需自己实现或说明。

五、配套代码

Released under the MIT License.