前面六篇我们把分治法、动态规划、贪心算法、回溯法、递归与递推、链表树图六大板块过了一遍。今天不聊具体代码,聊聊**考场上怎么把这 15 分从"直接放弃"变成"稳拿七八分"**。
一、七篇算法,一场考试:先做个回顾
这个系列从一开始的总纲,到分治法、DP、贪心、回溯、递归递推、链表树图,覆盖了第四题 90% 以上的考点。如果你一路跟着看下来,至少应该对下面这些词不再陌生了:
-
分治法:归并排序、快速排序、最大子数组——记住"拆、治、合"和递归式
T(n) = 2T(n/2) + n; -
动态规划:0-1 背包、最长公共子序列——记住"填表"和状态转移方程;
-
贪心算法:活动选择、Prim 最小生成树——记住"局部最优"和"每次选当前最小的";
-
回溯法:N 皇后、0-1 背包回溯版——记住"递归尝试 + 约束检查 + 剪枝/回溯";
-
递归与递推:斐波那契、汉诺塔、阶乘——记住"递归出口"和"自己调用自己";
-
链表/树/图:中序遍历非递归、链表逆置、图 DFS——记住"指针指对、顺序走对"。
但知道和拿到分之间,还差一个东西:考场策略。
二、下午题全局时间分配:90 分钟六道题
软件设计师下午《应用技术》共 90 分钟,6 道大题。时间分配决定了你能不能从容地做完,而不是做到第四题就崩盘。
| 题号 | 内容 | 分值 | 建议用时 | 优先级 |
|---|---|---|---|---|
| 第 1 题 | 数据流图 | 20 分 | 25~30 分钟 | 高 |
| 第 2 题 | 数据库设计 | 15 分 | 20~25 分钟 | 高 |
| 第 3 题 | UML 建模 | 15 分 | 20~25 分钟 | 高 |
| 第 4 题 | 算法(C 语言) | 15 分 | 20~25 分钟 | 中 |
| 第 5 题 | 设计模式(Java/C++ 二选一) | 15 分 | 20~25 分钟 | 高 |
| 第 6 题 | 设计模式(Java/C++ 二选一) | 15 分 | 不做 | — |
注意:第 5、6 题是二选一,选你熟悉的那道。如果你前面跟我一起把设计模式系列啃完了,这 15 分基本是白送的。
关键策略:第 4 题可以放在最后做。前三题套路固定,练熟了就是送分题;第 5/6 题设计模式也是送分题。先把这 50 分的"基本盘"稳稳拿到手,再回来啃第四题这块硬骨头。这样即使第四题只拿了 5 分,前面 50 分 + 后面 5 分 = 55 分,也过线了。
千万不要在第四题上死磕 40 分钟,导致后面设计模式的送分题没时间做。那是战略性自杀。
三、第四题的"抢分"策略:把 15 分拆成四块
第四题的 15 分,通常由四部分组成。每一块都有对应的"抢分"技巧:
1. 算法策略识别(3 分)—— 必拿,送分题
看到代码里有:
-
递归拆两半 + 合并 → 分治法
-
二维数组填表 + 从子问题推父问题 → 动态规划
-
"每次选当前最优"、"局部最优" → 贪心算法
-
递归尝试 + 不满足就退回去 → 回溯法
-
函数自己调用自己 + 递归出口 → 递归
这 3 分是白送的,一定要拿到。
2. 复杂度分析(3 分)—— 背下来就有分
把这张表印在脑子里:
| 算法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 归并排序 | O(n log n) | O(n) |
| 快速排序(平均) | O(n log n) | O(log n) |
| 快速排序(最坏) | O(n²) | O(n) |
| 0-1 背包 DP | O(n × C) | O(n × C) / O(C) |
| LCS | O(m × n) | O(m × n) |
| 活动选择(贪心) | O(n log n) | O(n) |
| Prim(邻接矩阵) | O(V²) | O(V) |
| N 皇后(回溯) | O(n!) | O(n) |
| 汉诺塔 | O(2^n) | O(n) |
| 斐波那契递归 | O(2^n) | O(n) |
| 斐波那契递推 | O(n) | O(1) |
| 二叉树遍历 | O(n) | O(h) / O(n) |
考场上如果记不清,记住几个万能规律:
-
有双重循环填二维表 → O(n²) 或 O(m × n);
-
有递归拆两半 → O(n log n);
-
有递归逐层减一 → O(n) 或 O(2^n);
-
有暴力回溯 → O(2^n) 或 O(n!)。
3. 代码填空(6~9 分)—— 能填就填,不能填就跳过
这是第四题的大头,也是最难的部分。但有几个技巧可以提高命中率:
技巧一:找递归出口 看到 if (___) 后面直接 return,填边界条件:
-
排序/分治:
begin >= end、low >= high -
递归数列:
n == 1、n == 0、n <= 2 -
链表:
p == NULL -
树:
root == NULL
技巧二:找递归调用 看到函数名后面跟参数,但参数变了:
-
分治:
mergeSort(arr, begin, mid)+mergeSort(arr, mid+1, end) -
快排:
quickSort(arr, low, pivotPos-1) -
回溯:
backtrack(k+1, ...) -
汉诺塔:
hanoi(n-1, ...)
技巧三:找指针操作
-
链表入栈/头插:
q->link = stacktop; stacktop = q; -
链表出栈:
stacktop = stacktop->link; -
二叉树向左:
ptr = ptr->lchild; -
二叉树向右:
ptr = ptr->rchild;
技巧四:找状态转移
-
DP 背包:
max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]) -
LCS:
dp[i-1][j-1] + 1或max(dp[i-1][j], dp[i][j-1])
如果实在不会,不要空着。根据上下文猜一个最合理的答案,写上去。软考阅卷是按点给分,写错了不扣分,写对了就给分。
4. 实例推演(3 分)—— 草稿纸走一遍
给定输入,让你写出输出。这题没有捷径,就是在草稿纸上一步一步走代码。不要嫌麻烦,走一遍比看十遍都管用。
走的过程中:
-
标清楚每一步变量的值;
-
递归的话画出调用栈;
-
填表的话把表格画出来。
四、各板块得分预期:别想着满分,想着稳分
根据前面六篇的案例难度,给你一个现实的得分预期:
| 板块 | 题目难度 | 预期得分 | 拿分关键 |
|---|---|---|---|
| 分治法 | 中等 | 7~10 分 | 归并/快排代码模板背熟 |
| 动态规划 | 较难 | 6~9 分 | 状态转移方程填对 |
| 贪心算法 | 中等 | 7~10 分 | 策略识别 + 复杂度 |
| 回溯法 | 中等 | 6~8 分 | 递归出口 + 约束条件 |
| 递归与递推 | 较易 | 8~10 分 | 递归出口 + 调用式 |
| 链表/树/图 | 中等 | 7~10 分 | 指针操作 + 遍历顺序 |
底线目标:第四题拿 7 分(策略识别 3 分 + 复杂度 3 分 + 代码填空蒙对 1 空)。
理想目标:第四题拿 10 分(策略识别 3 分 + 复杂度 3 分 + 代码填空对 2~3 空 + 实例推演对)。
天花板:第四题拿 12~15 分。这需要你对算法有较深的理解,且考场上状态好。但记住,45 分及格,不需要天花板。
五、"不会也能拿分"的猜题口诀
最后送你一套猜题口诀,考场上脑子一片空白时,拿出来用:
策略识别四选一:
-
拆两半、递归、合并 → 分治
-
填表、子问题推父问题 → 动态规划
-
选当前最优、不回头 → 贪心
-
尝试、冲突、退回去 → 回溯
-
自己调用自己、有出口 → 递归
复杂度常见值:
-
排序类 → O(n log n)
-
填表类 → O(n²)
-
暴力递归 → O(2^n)
-
树遍历 → O(n)
代码填空看上下文:
-
if (___)后面直接return→ 找边界条件 -
函数名 + 变参数 → 找递归调用
-
->箭头 → 找指针成员(lchild、rchild、next、link) -
max(、min(→ 找状态转移或比较逻辑
六、写在最后:45 分及格,不是 75 分满分
备考软件设计师,很多人死在两个心态上:
一是"完美主义":非要把每道题都搞懂,结果时间不够,后面送分题没时间做。
二是"自我放弃":看到第四题是算法,直接跳过,连策略识别和复杂度的 6 分都不要了。
这两种心态都要不得。软考是通过性考试,不是选拔性考试。45 分及格,意味着你可以策略性地放弃一部分分数,只要保证其他部分稳稳拿到。
第四题 15 分,你拿 7 分,不亏;拿 10 分,血赚;拿 5 分,前面三题和设计模式拿满,照样过。
这个系列七篇博客,从总纲到分治、DP、贪心、回溯、递归、链表树图,覆盖了第四题的全部考点。如果你能把这七篇里的代码框架、填空套路、复杂度表背下来,考场上第四题至少能拿到一个"不拖后腿"的分数。
算法这东西,说到底不是背出来的,是练出来的。但软考不是算法竞赛,它考的是你能不能在给定的框架里,把缺的那几块拼图补上。
所以,别被第四题吓到。跟着这个系列,一道一道来,一步一步走。
及格线 45 分,不是让你做对所有题,而是让你别放弃任何一题。
七、系列目录(完整版)
-
总纲:从"直接放弃"到"稳稳拿分"的备考策略
-
分治法:归并排序与快速排序的"拆、治、合"
-
动态规划:0-1 背包与最长公共子序列的"填表艺术"
-
贪心算法:活动选择与最小生成树的"局部最优"
-
回溯法:N 皇后与 0-1 背包的"走迷宫艺术"
-
递归与递推:斐波那契、汉诺塔与阶乘的"自我调用"
-
链表/树/图:指针操作、遍历顺序与邻接矩阵的"基本功"
-
完结篇:从"放弃"到"稳拿"的备考心法(本篇)
这个系列到这里就全部结束了。如果你跟着看到了这里,感谢你的耐心。祝备考顺利,45 分稳过。

243

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



