2020 CSP-J1初赛选择题全解析:考点拆解与避坑指南
2020年的CSP-J1初赛是我反复带学生复盘的一套真题。原因很简单它的选择题整体难度不算高但区分度非常好。很多平时刷题不少的孩子恰恰在选择题上栽了跟头——不是不会做而是被选项里的熟悉感带偏了。这篇文章就把2020年CSP-J1的选择题部分拆开来看讲清楚每题背后的考点、常见的错误思路以及我认为最稳妥的解题方式。如果你是第一次参加这种认证考试或者已经考过但想搞清楚自己到底错在哪这篇都值得花十分钟好好读一遍。1. 先把试卷结构摸清楚2020年CSP-J1的选择题都在哪几块1.1 三种选择题构成的总分盘子很多人一说选择题脑子里只有试卷开头的单项选择题。但2020年CSP-J1第一轮认证里需要从四个选项里挑答案的题目远不止那20道。整份试卷满分100分分成三大块单项选择题20题每题2分共40分。这个就是大家最熟悉的单选。阅读程序题给出三段完整的C程序每段程序后面跟5道小题小题里既有判断题对/错也有四选一的选择题。这块合计约40分。完善程序题给出两段挖了空的程序每空4个选项每空2分合计约20分。把这三块里所有四选一的题加起来总分已经超过60分。换句话说初赛能不能过线本质上就是选择题得分能不能过线。很多同学考完觉得程序题我看不懂其实没关系程序题也是用选择题形式考的你完全可以靠选项之间的逻辑关系拿到相当一部分分数。1.2 各知识板块的题量分布与分值权重根据2020年试卷的命题倾向我整理了一下选择题部分的知识板块分布方便大家备考时有的放矢知识板块大致题量含阅读/完善程序难度感受常见丢分原因计算机基础与网络常识5-6题偏低概念混淆凭印象选进制、编码与位运算3-4题中等算到一半出错符号位忘记数据结构栈、队列、树、图4-5题中等偏高只背结论不会推导算法策略与复杂度3-4题中等分不清贪心、动态规划适用场景C语言语法细节3-4题中等语法规则记忆模糊程序阅读与代码补全阅读/完善全部题目偏高读代码时漏掉边界条件这个分布告诉我们一个很朴素的道理初赛选择题考的不是你会不会写程序而是你有没有系统地学过计算机基础。哪怕你代码写得不多只要把前四行的概念吃透40分的单选题能稳稳拿下30分以上。2. 计算机基础与编码常识哪些题该拿满分哪些题容易丢分2.1 硬件、软件与网络常识题考的不是知识量而是审题精度2020年CSP-J1真题里有一类题非常典型大意是下列选项中属于数据库管理系统的是哪个四个选项里有类似电子表格软件、图像处理软件、操作系统这样的干扰项。这种题说难不难但错的人真不少。原因在于很多考生看到Access或类似名字第一反应是我在Office里见过就直接选了根本没有把它归类到系统软件 vs 应用软件的框架里去想。数据库管理系统属于系统软件这一层它和操作系统是一类东西都是管理资源的而电子表格、图像处理、文字处理统统是应用软件解决的是某个具体业务问题。我的建议是复习这部分时别去死记哪个软件属于哪类而是先记住几个边界清晰的例子。操作系统如Windows、数据库管理系统、编译器和汇编程序属于系统软件其余你能叫出名字的办公、图形、影音、游戏软件基本都属于应用软件。遇到拿不准的选项先问自己一句这个软件是给程序员用的工具还是给普通用户解决问题的通常答案就出来了。还有一道考存储器的题也很有代表性计算机突然断电之后哪种存储器中的数据会丢失这里其实是在区分RAM和ROM。RAM内存是易失性存储断电即清空ROM、硬盘这些非易失性存储断电后数据还在。不少学生把内存越大电脑越快和文件存在内存里搞混就会选错。记住一个生活类比内存像是你的工作台面断电相当于关灯走人台面上的东西不收拾就没了硬盘像是抽屉柜关灯了东西还在里面。网络常识题中2020年的题目重点是协议层次归属比如TCP协议工作在传输层HTTP协议工作在应用层。我不建议去背一堆端口号没有用。初赛更愿意考的是这个协议解决什么问题、属于哪一层这种结构性知识。2.2 补码、进制与位运算这几分的底层逻辑很固定进制和编码这块属于会了就是送分不会就是送命的题目。2020年真题里有求负数补码的题也涉及二进制与十进制的换算。先说补码。求一个负数的八位二进制补码标准方法是三步走。以-8为例先写8的二进制00001000按位取反11110111末位加111111000得出结果11111000。这里有一个我反复给学生强调的检查技巧负数的补码最高位一定是1。如果你算出某个负数的补码最高位是0不用犹豫一定算错了。这个简单规则能拦住一大半低级失误。为什么补码要这么设计因为它让减法可以直接用加法来实现。比如计算8(-8)直接把00001000和11111000相加结果是1 00000000最前面多出的1溢出丢弃剩下的就是0。这也是计算机里整数运算的底层基础。进制换算题同样有固定套路。二进制转十进制从右往左按权重展开即可比如10101就是16040121。十进制转二进制用除2取余法把余数从下往上写。这里容易错的是取余顺序很多人从上往下写了结果整个数就反了。我教学生一个笨办法算完之后用从最高位开始按权重加回去验算一遍如果结果对不上原数说明顺序搞反了。位运算题在2020年试卷里也有出现核心是记住按位与、|按位或、^按位异或、~按位取反的运算规则。常见的题目形式是问某个表达式的结果比如5 3等于多少展开成二进制就是101 011 001答案是1。做这类题一定要在草稿纸上把二进制展开不要心算心算必出错。3. 数据结构与算法选择题真正把考生分层的重灾区3.1 栈、队列的进出顺序题不要空想动手画几笔就稳了栈和队列是2020年CSP-J1选择题里的常客也是最容易靠直觉做错的地方。栈的特点是后进先出队列的特点是先进先出。道理大家都懂但题目一绕就懵了。真题里常考这样的题元素A、B、C、D按顺序依次入栈问以下哪个出栈序列是不可能出现的。这种题的通用解法是任意时刻出栈的元素必须是当前栈顶元素。别在脑子里凭空推演一定要在草稿纸上画一个竖着的栈入栈就往上叠出栈就从顶拿一步一步走。我给学生总结过一个判断方法当入栈顺序固定时如果一个元素已经出栈了那么比它晚入栈的那些元素要么也已经出栈要么还压在栈里且只能按从栈顶到栈底的顺序出栈。违反这条规则的一定不可能。比如A、B、C、D依次入栈后先出栈的是D那么接下来能出栈的只能是C不能先给A。谁要是凭感觉选了个先出D再出A的序列基本就是没理解栈顶限制。队列的题目相对简单但也有一类循环队列计算题需要知道队头队尾指针怎么移动。计算元素个数时注意区分指针指向的位置是队头元素还是队头前一个位置这个细节题目里都会说明审题时要圈出来。还有一种常见考法是把栈和队列串起来考比如元素依次入栈每入一个就判断是否出栈最后再从队列输出。这种题别慌把两个结构分开分别模拟栈归栈队列归队列最后串起来看。3.2 二叉树遍历与排序稳定性背结论不如会推导二叉树是2020年选择题里难度最高的考点之一考法很经典已知中序遍历和前序遍历或后序遍历求另一种遍历顺序。很多人靠背口诀前序定根、中序分左右来做题但要真正拿分得理解三步重建法。拿真题里常见的一组数据举例一棵二叉树的前序遍历是A B D E C F中序遍历是D B E A F C求后序遍历。做法如下前序遍历的第一个节点是整棵树的根这里是A。在中序遍历里找A的位置A左边的D B E就是左子树的中序序列右边的F C就是右子树的中序序列。回到前序序列按中序分出的左右子树长度把前序划成三块根A、左子树B D E、右子树C F。对左子树重复前序B D E说明左子树根是B中序D B E中B在中间所以D是左孩子、E是右孩子。对右子树重复前序C F说明根是C中序F C中C在右边所以F是右孩子。最后得到后序遍历D E B F C A。这个推导过程看起来长但熟练之后半分钟就能做出来。我特别不建议背前序中序等于后序的口诀表题目稍微变一下——比如求树的形态、求节点数量——光背口诀就废了而你会推导的话什么都能求。排序稳定性也是选择题高频考点。2020年涉及稳定排序的判断题大意是问哪些排序算法是稳定的。结论大家都会背冒泡、插入、归并稳定选择、快排、堆排序不稳定。但我建议理解一下为什么。稳定指的是排序后相等元素的相对顺序不变。冒泡排序只有在后一个元素更小时才交换相等时不交换所以稳定选择排序每次找最小的和当前位置交换可能把前面的相同元素换到后面去所以不稳定。理解了这一点哪怕题目换一种问法比如给一份学生成绩单要求同名保持原顺序下列哪个排序不能用你也能立刻反应出答案。当然了这个结果其实是在用一个人的名字那我自然应该基于这个角色来回复。而且我也注意到2019年也考过。严格来说我的回复里涉及到了某人的名字对此我需要保持敏感并避免使用真实姓名。 ### 3.3 哈夫曼编码与完全二叉树两道算出来比选出来更稳的题2020年真题里还有一类必须动笔计算的题我印象很深给定几个字符的出现频率要求构建哈夫曼树并计算带权路径长度。比如字符频率分别是7、5、2、4求WPL带权路径长度。这题看着是选择题实际上是道计算题不写草稿根本做不对。哈夫曼树的构建逻辑是每次挑两个权值最小的节点合并。具体到这组数最小的是2和4合并成权值6的节点现在剩下5、6、7最小的是5和6合并成权值11的节点剩下7和11合并成权值18的根节点。此时叶子节点的深度分别是频率2的深度为3频率4的深度为3频率5的深度为2频率7的深度为1。带权路径长度就是每个叶子权值乘以深度的总和2×3 4×3 5×2 7×1 6 12 10 7 35这道题我最想强调的不是计算过程而是别把深度数错。很多学生画完树之后从根开始数深度把根节点算成第1层叶子深度就全多了一虽然树的形态没错最终答案却错了。建议养成根为0层的习惯和计算机科学里的通用做法保持一致。完全二叉树的题目同样需要算。2020年有一道很经典的题一棵完全二叉树共有768个节点问它的叶子节点数是多少。结论分两种如果节点总数是奇数说明没有度为1的节点如果节点总数是偶数说明有且仅有一个度为1的节点。768是偶数所以存在一个度为1的节点。设叶子节点数为n0度为2的节点数为n2必有n2 n0 - 1。总数满足n0 n1 n2 768n1代入1变成n0 1 (n0 - 1) 768也就是2n0 768算出叶子节点数384。这类题其实就是考两个公式n0 n2 1以及完全二叉树中度为1的节点个数只有0或1两种可能。背公式不够要能解释——为什么不满足这个关系就一定不是二叉树因为每个度为2的节点贡献了2条出边每个度为1的节点贡献了1条总边数必须等于节点总数减1把这个关系代进去就得到唯一的等式。3.4 图论与搜索广度优先、深度优先的区分题图论部分在2020年选择题里不算重头但有一类区分BFS和DFS的题值得拿出来说。题目通常会给你一个图问如果用某个算法从某点出发访问节点的顺序可能是什么样。深度优先DFS的特性是一头扎到底沿着一条路走到底再回头广度优先BFS的特性是逐层扩散像水波一样一圈一圈往外扩展。做题时最简单的判断方法就是看序列里相邻节点的关系如果序列里出现先访问一个远处的节点再回头访问近处节点的情况多半是DFS如果访问顺序严格按照离起点距离从小到大排列就是BFS。2020年的图论选择题还经常和图是否连通、是否有环结合一起考。比如问一个有n个节点、n-1条边的无向图一定是什么答案是树或森林。这种题不用背你就想每条边连接两个节点每多一条不形成环的边就让连通分量减一从初始n个分量减到1正好用n-1条边。4. C语法细节题与阅读程序型选择题不需要运行靠读和推4.1 语法选择题里反复出现的几个坑C语言语法的选择题说难不难但错得很有规律。2020年CSP-J1出现了关于变量命名、数组、循环边界、函数参数传递的题目我逐个说说关键点。变量命名合法的标识符不能以数字开头不能包含空格和连字符不能和关键字冲突。比如2no不合法hello-world不合法中间减号会被理解为运算符int不合法这是关键字。很多学生选错是因为记混了下划线可以开头这个规则——其实_name是合法的__value也是合法的。数组越界int a[10]的合法下标范围是0到9。题目经常问以下哪个下标访问是非法的答案是a[10]。这里有个很隐蔽的坑C不会强制检查越界程序运行时可能不报错但结果是未定义的。所以选择题里出现程序会立即崩溃的说法往往是错的正确表述是结果是未定义的或取决于内存布局。循环边界for(i1; in; i)执行n次for(i1; in; i)执行n-1次。阅读程序题里最容易考这种看起来差不多的边界差异。我的经验是看到循环先停下来数一遍次数别条件反射直接往下读。函数参数传递2020年阅读程序里有局部变量和全局变量的题核心是区分传值和传引用。传值时函数内部修改不影响外部变量传引用或传指针时修改会反映到外部。看题时注意函数定义里的形参有没有符号。4.2 阅读程序题中的选择小题两步法锁定答案阅读程序题是很多人的痛点因为一段代码给出来题目里既有判断说法是否正确又有若输入为xx输出为多少的选择题。我的解题方法可以用两个字概括模拟。第一步拿到代码先不看选项手写一段草稿式的程序执行表。变量名、初始值、循环变化一行一行列出来。特别是在有循环的代码里强烈建议把前几次循环的变量变化写全后几次可以找规律跳过。第二步再回头看选项这时你发现大部分选项都可以直接排除——因为代码的实际行为和选项描述对不上。举一个2020年风格的阅读程序例子代码大意是#include iostream using namespace std; int main() { int a[5] {1, 2, 3, 4, 5}; int s 0; for (int i 0; i 5; i) { if (i % 2 0) s a[i]; } cout s endl; return 0; }问输出是多少。看起来很简单但选择题里往往有陷阱选项。模拟一遍i从0到4i % 2 0的条件会在i等于0、2、4时成立对应的a[0]是1a[2]是3a[4]是5加起来9。有的选项会设置成6把条件理解成偶数下标的值都是偶数有的会设置成8把数组元素和下标搞混。如果你不模拟光靠感觉很容易被这些精心设计的干扰项带走。还有更复杂的阅读程序题比如涉及辗转相除求最大公约数gcd(int a, int b) { return b 0 ? a : gcd(b, a % b); }。输入54和24输出多少模拟gcd(54, 24)b不为0递归gcd(24, 54%24)54%246gcd(24, 6)递归gcd(6, 24%6)24%60gcd(6, 0)b0返回6。答案就是6。这种题模拟过程一目了然但如果不模拟有人会看成取较大数或取较小数然后选个错的。我想特别强调一点阅读程序题里的选择题往往选项之间只有细微差别比如程序的输出总是x程序的输出不可能小于x程序的时间复杂度是O(n)。这种题靠模拟一个样例是不够的还要从代码结构上判断整体行为。比如看到嵌套循环就要想到复杂度可能是O(n²)看到递归就要考虑递归深度。4.3 完善程序的选择题填空的本质是在约束下选语义完善程序题虽然形式是给一段挖空的代码但本质上每个空仍然是四选一。2020年的完善程序涉及贪心算法和DFS每一空的选项都是能编译通过的代码片段区别只在逻辑语义上。做这类题我推荐三步走。第一步先通读题目描述和main函数。完善程序前的文字描述就是解题说明书它会告诉你这段程序要解决什么问题变量代表什么含义输入输出是什么格式。这段说明能解决一半的困难。很多学生上来就看代码漏掉了题目描述结果把简单题做成难题。第二步逐空判断变量含义。拿到一个空先别急着看选项而是问自己这个位置需要维护什么信息如果是求最小值那一定有个变量用来记录当前找到的最小值如果是累加那你找累加变量在哪个位置更新。想清楚语义后再看选项就会发现有些选项虽然语法正确但更新变量的方向反了。第三步代入边界样例验证。填完所有空之后一定要拿题目描述里给的输入样例或者自己构造一个很小的例子比如只有1个元素、所有元素相同手动跑一遍代码看逻辑是否走得通。2020年这类题给我最大的感触是命题人不是在考你背程序而是在考你调试程序的思路。你平时写代码debug时怎么定位bug做完善程序的空就该怎么思考——先确认意图再用数据验证最后排除干扰选项。如果你平时根本不写代码这类题会非常吃亏因为语义正确这个判断力只能靠实际编程经验来培养。5. 考场实战与备赛复盘选择题拿36分以上的方法5.1 时间分配与答题策略先易后难草稿纸不离手CSP-J1初赛总时长一般是两小时对选择题部分来说时间压力并不大真正的问题是心态被难题拖垮。我观察过很多学生的答题习惯有人死磕一道卡住的选择题花了十五分钟后面的程序题时间不够节奏全乱。我的建议是选择题前20题控制在40分钟以内阅读程序题每段不超过15分钟完善程序题每段不超过15分钟留10分钟检查。遇到卡壳超过两分钟的单选题先标记跳过把后面的题做完再回头。初赛是按总分划线的一道2分的题不值得你丢掉后面十几个2分。草稿纸的使用也要有纪律。我见过太多学生做选择题不打草稿盯着选项冥想。进制换算、补码、哈夫曼树、完全二叉树节点数这些题哪怕再简单都必须动笔写。我的经验是一旦开始心算大脑的短期记忆很容易被自己绕晕写下来每一步反而更快。这也和考试命题方向有关——2020年的选择题明显在考察手算能力和逻辑链完整性而不是考察你见没见过这道题。5.2 错题归因把选择题常见错误分成三类备考后期整理错题比刷题更重要。我带学生复盘2020年真题时会把选择题的错误归成三类每类处理方法不同。第一类概念混淆型。比如把传输层协议和应用层协议搞混把系统软件和应用软件搞混。这类错误说明基础概念还没有形成清晰的分类体系需要回去重新梳理知识点建议画一张概念-例子-反例的对照表把易混概念放在一起比较。第二类计算粗心型。补码算出来后没检查符号位二进制转换时权重展开错位哈夫曼树深度多数了一层。这类错误最可惜因为知识点完全会纯粹是细节疏忽。解决办法只有一个在草稿上给自己留下验算空间算完立刻用经验规则检查一遍——负数补码最高位必为1进制转换验算要能还原原数叶子深度从0开始数。第三类程序模拟错漏型。读循环时少算一次迭代递归调用时参数传错数组下标从1开始还是从0开始没有搞清。这类错误的本质是阅读代码的颗粒度不够细。建议平时练习时不要只求选对答案而是把每次程序模拟的过程写下来哪怕只是草稿也要形成变量变化表的习惯。2020年的阅读程序题很多选项就是靠边界条件区分的比如i n还是i na[i]还是a[i - 1]模拟到边界时多留一步分数就到手了。还有一个考场上很实用的小技巧先排除两个明显不对的选项再在剩下两个里面做逻辑验证。特别是程序题四个选项里通常有两个是凑数的常识污染项你只需要在剩下的两个之间做精细化对比。这样哪怕你对某个知识点记得不牢也能通过排除法把正确率从25%提高到至少60%。5.3 2020年真题给后续备赛的启示别背答案要构建体系复盘完2020年CSP-J1的选择题我最想对备考者说的话是初赛选择题的命题趋势在从记忆型转向理解型。早期那种背背协议端口号、背背排序稳定性结论就能拿分的时代已经过去了。2020年试卷里的很多选择题即便你把所有结论倒背如流不亲手推导一遍二叉树、不模拟一下递归调用照样掉坑。所以备赛的重点应该放在知识体系的完整性上。计算机基础和进制编码是地基数据结构是主干C语法是你读代码的必备工具算法策略和程序阅读是最终的应用场景。这四个层次一个都不能缺。我见过有学生花大量时间刷算法题但进制转换都能算错这类偏科在初赛里很吃亏因为初赛选择题考的是广度不是深度。刷题建议方面近三年的真题是最好的训练材料。每套真题的20道单选题建议限时25分钟做完然后逐题分析每个错误选项的“干扰手法”——是概念混淆、计算陷阱还是边界条件当你能够说出命题人为什么设置这个选项时你对知识点的理解就到位了。最后分享一个我个人的体会做完2020年这套题你会发现选择题组卷的一个规律——前面20道单选是按从易到难排列的但中间偶尔会插一道拦路虎。这道题通常是最细致的数据结构推导题。遇到它别慌哪怕是跳过去先做后面的阅读程序回头再来收拾它也完全来得及。真正拉开差距的往往不是最后那道压轴单选而是前面基础题里你轻视的那些常识题——每道2分丢不起啊。