2025年CSP-J第一轮笔试试题分析讲解(三)——完善程序题深度解析
完善程序题是CSP-J第一轮的压轴题型,满分30分(每小题3分)。本题型给出一段不完整的代码,要求从选项中选出正确的语句填入空白处。本文对2025年真题的2道完善程序题进行深度解析。
一、完善程序题整体分析
题量与分值:共2道大题,每道含5个空白,每空3分,满分30分 考查形式:给出完整注释的不完整代码 → 理解算法意图 → 选择正确语句填空 解题核心:理解算法思想,结合上下文推断空白处含义
时间分配建议:2道题约25~30分钟
二、第一道完善程序题:字符串解码
题目背景
问题描述:给定一个经过编码的字符串,要求将其解码为原始字符串。
编码规则(示例):
原字符串: "aaaabbbcc"
编码后: "a4b3c2"
即:字符 + 重复次数,如果字符只出现1次,则省略数字1。
核心算法思路
// 算法:遍历编码字符串,识别"字符"和"数字"
// 遇到字符:记录当前字符ch
// 遇到数字:累计数字值count(可能有多位)
// 输出:将ch重复count次
逐空解析
第33空:判断下一个字符是否在字符串范围内
正确选项:C 解析:需要判断当前位置 i的下一个字符是否存在(即i+1 < z.length()),以防止越界访问。
第34空:计算连续数字的值
正确选项:B 解析:当遇到连续数字字符时(如"123"表示123),需要逐位计算:
count = count * 10 + (z[i] - '0');
// 举例:z[i]序列为 '1','2','3'
// count = 0*10+1 = 1
// count = 1*10+2 = 12
// count = 12*10+3 = 123
第35空:循环输出重复字符
正确选项:B 解析:需要将当前字符 ch重复count次并输出,循环次数为count。
第36空:字符只出现1次时的处理
正确选项:B 解析:编码规则中,重复1次的字符不写数字1,所以当 count为默认值1时,直接输出字符ch即可。
第37空:处理完一个数字块后,更新索引
正确选项:C 解析:处理完一个数字(可能是多位数)后,需要将索引 i自增1,以处理下一个字符。
代码框架(理解版)
string decode(string z) {
string ans = "";
char ch = ' ';
int i = 0;
while (i < z.length()) {
if (isalpha(z[i])) { // 是字母
ch = z[i];
i++;
// 判断下一个是否是数字【33空】
if (i < z.length() && isdigit(z[i])) {
int count = 0;
while (i < z.length() && isdigit(z[i])) {
// 计算数字值【34空】
count = count * 10 + (z[i] - '0');
i++;
}
// 输出count次ch【35空】
for (int j = 0; j < count; j++)
ans += ch;
} else {
// 只出现1次【36空】
ans += ch;
}
} else {
i++; // 【37空】处理下一个字符
}
}
return ans;
}
三、第二道完善程序题:精明人与糊涂人
题目背景
问题描述:有 n 个人,每个人判断其他人是"精明人"还是"糊涂人"。根据一定的逻辑推理规则,找出真正的精明人。
背景知识:这是一道逻辑推理题,类似"骑士与无赖"问题:
精明人只说真话 糊涂人只说假话(或者行为不可预测)
核心算法思路
// 算法:遍历每个人,假设他是精明人(候选者)
// 验证他对所有人的判断是否自洽
// 如果出现矛盾,则更换候选者
逐空解析
第38空:初始化候选者
正确选项:B 解析:初始时没有候选者( candidate = 0),信任计数count = 1(表示当前候选者被多少人信任)。
第39空:候选者判断当前人为糊涂人时的处理
正确选项:D 解析:如果候选者认为当前人 i是糊涂人,而i也认为候选者是糊涂人,则出现矛盾——两人互相认为对方糊涂,根据规则需要同时淘汰两人,更换候选者。
第40空:两人互相判断对方为糊涂人时的处理
正确选项:C 解析:互相认为对方糊涂 → 两人都不能是精明人 → 候选者需要更换(重置)。
第41空:候选者被否定时的处理
正确选项:A 解析:当有人否定当前候选者时,信任计数 count递减。如果count降为0,则更换候选者。
第42空:最终输出
正确选项:C 解析:经过完整遍历后, candidate中保存的就是推理出的精明人,直接输出即可。
算法核心逻辑
初始:candidate = 0, count = 1
遍历 i = 1 to n:
如果 candidate 认为 i 是精明人:
count++ // 信任度+1
如果 candidate 认为 i 是糊涂人:
如果 i 也认为 candidate 是糊涂人:
// 矛盾!两人同时出局
candidate = i+1(或更换)
count = 1
否则:
count-- // 信任度-1
如果 count == 0:
更换 candidate
最终:输出 candidate
四、完善程序题解题技巧
技巧1:先读注释,理解算法
Step 1: 通读代码,重点关注注释
Step 2: 用一句话概括算法思想
Step 3: 明确每个变量的含义
示例:
// 这段代码在做什么?
→ "字符串解码"
→ 核心变量:ch(当前字符)、count(重复次数)
→ 关键操作:识别数字、计算count、输出重复字符
技巧2:看上下文,推断空白含义
上文:... ch = z[i]; i++; ...
空白:______(第33空)
下文:... count = 0; while(isdigit(z[i])) ...
推断:空白处在"读取字符后、处理数字前"
→ 应该判断"下一个是否是数字"
技巧3:排除明显错误选项
选项含以下特征的,优先考虑排除:
❌ 数组越界(如 a[n] 访问第n个元素)
❌ 死循环(如 i++ 写在错误位置)
❌ 逻辑矛盾(如先 i++ 再使用 i-1,但上下文不支持)
❌ 类型不匹配(如 int 和 string 混用)
技巧4:验证填入后的完整性
填入选项后,问自己:
1. 程序能编译通过吗?(语法正确?)
2. 变量在使用前初始化了吗?
3. 循环能正常结束吗?(无死循环?)
4. 边界情况(i=0, i=n)处理正确吗?
五、高频算法类型总结
| 完善程序题类型 | 出现频率 | 备考重点 |
|---|---|---|
| 模拟类(字符串处理) | 每次1题 | 字符串函数、循环控制 |
| 查找/排序类 | 每次1题 | 二分查找、快排/归并排序 |
| 动态规划 | 偶尔出现 | 状态转移方程 |
| 图论/树 | 偶尔出现 | DFS/BFS、最短路径 |
| 数学/逻辑 | 偶尔出现 | 模拟推理、数学公式 |
六、2025年真题整体评价
| 题型 | 难度评价 | 主要考点 |
|---|---|---|
| 单项选择题 | ★★☆(中等) | 基础语法、组合数学、数据结构 |
| 阅读程序题 | ★★★(偏难) | 模拟执行、gcd、排序、LIS |
| 完善程序题 | ★★☆(中等) | 字符串处理、逻辑推理 |
总体评价:2025年CSP-J第一轮难度与往年持平,无偏题怪题,重点考查代码阅读能力和基础算法理解。
七、2026年备考建议
时间规划
现在~8月:系统学习语法和基础算法
9月上旬:刷近5年CSP-J第一轮真题(至少3遍)
9月中旬:重点攻克阅读程序题和完善程序题
考试前1周:模拟考试,严格控制时间
推荐练习资源
洛谷:P1000~P2200 中的入门题 CCF 官网:历年真题(https://www.noi.cn/) CSP-J 初赛模拟卷:各大OJ均有收录 《信息学奥赛一本通》:初赛篇
八、总结
完善程序题考查的是算法理解能力和代码补全能力。
核心要点:
先理解算法思想,再填空 注意上下文的变量含义和流程控制 对常见算法模板(字符串、排序、查找)要非常熟悉 时间允许时,在草稿纸上模拟填入后的执行过程
📌 系列总结: ① 【环境指南】CSP-J/S 第二轮上机环境介绍及操作 ✅ ② 【选择题】2025年CSP-J第一轮笔试试题分析讲解(一)✅ ③ 【阅读题】2025年CSP-J第一轮笔试试题分析讲解(二)✅ ④ 【完善题】2025年CSP-J第一轮笔试试题分析讲解(三)✅
四篇推文完整覆盖CSP-J备考核心内容,建议系统学习、反复阅读!
作者:csp信奥资料共享团队 | 祝所有同学2026年CSP-J取得好成绩! 需要完整试题PDF、标准答案和更多解析,请关注 IMA 知识库「csp」。
夜雨聆风