ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CSP-J初赛零基础冲刺:核心知识点与避坑指南

CSP-J初赛零基础冲刺:核心知识点与避坑指南 1. 先搞清楚CSP-J初赛到底在考什么很多人第一次接触CSP-J以为初赛就是随便做做选择题背几个知识点就能过。我带过几届学生也见过太多人栽在初赛上——不是不会写代码而是根本不知道初赛的套路。CSP-J入门级初赛笔试全称是CCF非专业级别软件能力认证入门级第一轮形式是笔试现在很多省份改成了机考满分100分考试时间120分钟。它不考你写完整程序考的是计算机基础知识、算法理解、数据结构概念、数学逻辑和阅读程序的能力。说白了初赛是一道筛子筛掉那些只会拖控件、背模板、对底层原理一窍不通的人。你如果连二进制补码都算不明白连冒泡排序和选择排序的区别都说不清连递归的调用栈都画不出来那初赛就是你的天花板。反过来初赛的知识点其实非常有限翻来覆去就那些东西只要系统梳理一遍零基础也能冲过去。这篇文章我打算把CSP-J初赛的核心知识点全部拆开从计算机基础到算法思维从数据结构概念到阅读程序技巧一个不落。我会告诉你每个知识点为什么考、怎么考、容易在哪里挖坑以及我实际教学中总结出来的记忆方法和避坑经验。不管你是完全零基础的小白还是学过一点C但没系统复习过的选手这篇内容都能直接拿来当冲刺提纲用。先给你一个整体框架CSP-J初赛的考点分布大致是这样的模块占比核心内容计算机基础知识约15%进制转换、编码、硬件常识、网络基础程序设计语言基础约10%C语法、变量类型、运算符优先级数据结构约20%栈、队列、链表、树、图的基本概念算法基础约25%排序、查找、递归、贪心、动态规划入门数学逻辑约15%排列组合、概率、逻辑推理、复杂度分析阅读程序与完善程序约15%代码理解、填空补全这个比例不是官方公布的是我根据近五年真题统计出来的大致分布。你可以看到算法和数据结构加起来占了将近一半所以复习的重心必须放在这两块。但计算机基础那15%是送分题绝对不能丢丢了就亏大了。提示初赛的单选题每题2分判断题每题1分阅读程序题每空2分左右完善程序题每空3分左右。阅读程序和完善程序加起来差不多30分这部分是拉开差距的关键。2. 计算机基础知识送分题也不能掉以轻心2.1 进制转换与编码必须练到条件反射进制转换是每年必考的内容没有例外。二进制、八进制、十进制、十六进制之间的互转你必须做到看到就能算不能犹豫。我见过太多学生在考场上用草稿纸一位一位地除时间根本不够用。先说十进制转二进制。最常用的方法是除2取余倒序排列。比如把45转成二进制45除以2得22余122除以2得11余011除以2得5余15除以2得2余12除以2得1余01除以2得0余1。把余数从下往上读就是101101。这个方法很稳但速度慢。我教学生一个更快的方法记住2的幂次方2^012^122^242^382^4162^5322^6642^71282^82562^95122^101024。看到45先找小于等于45的最大幂次3245-321313里面最大的是813-855里面最大的是45-411就是1。所以4532841对应的二进制位就是101101。这个方法熟练之后三秒钟就能出结果。二进制转八进制和十六进制更简单因为82^3162^4所以每三位二进制对应一位八进制每四位二进制对应一位十六进制。比如二进制11010110从右往左每四位分组1101和01101101是D0110是6所以十六进制就是D6。八进制就是每三位分组11和010和110分别是3、2、6所以是326。这个技巧在考试里能省大量时间。原码、反码、补码也是高频考点。正数的原码、反码、补码相同。负数的反码是原码除符号位外按位取反补码是反码加1。比如-5用8位表示原码是10000101反码是11111010补码是11111011。考试经常考的是补码转十进制或者两个补码相加的结果。记住一点计算机里所有整数都是用补码存储的所以看到补码要会还原成原码再算数值。ASCII码也经常考。记住几个关键值A是65a是970是48空格是32换行是10。大小写字母之间差32这个规律能帮你快速推算。比如告诉你C是67那c就是673299。这种题就是送分但如果你没背过就只能干瞪眼。2.2 计算机硬件与网络常识别在这里丢冤枉分计算机硬件部分考得比较浅但覆盖面广。CPU由运算器和控制器组成运算器负责算术和逻辑运算控制器负责指令译码和执行。内存分为RAM和ROMRAM断电后数据丢失ROM断电后数据保留。Cache是高速缓存速度比内存快但容量小用来缓解CPU和内存之间的速度差距。这些概念经常以选择题形式出现比如问断电后数据会丢失的是哪个答案就是RAM。存储单位换算也是必考1字节8位1KB1024B1MB1024KB1GB1024MB1TB1024GB。注意这里都是1024不是1000。考试经常在这里挖坑比如问你1GB等于多少字节你要算1024×1024×10241073741824字节。这种题不难但容易算错建议在草稿纸上一步步写清楚。网络基础部分IP地址、域名、协议是重点。IPv4地址是32位分成4段每段8位范围是0到255。比如192.168.1.1就是一个合法的IPv4地址。IPv6是128位这个知道就行考得不多。常见协议要记住HTTP是超文本传输协议FTP是文件传输协议SMTP是邮件发送协议POP3是邮件接收协议TCP是传输控制协议UDP是用户数据报协议。TCP可靠但慢UDP快但不可靠这个区别经常考。注意网络部分偶尔会考子网掩码和IP分类但CSP-J入门级考得很浅把A类、B类、C类地址的范围记住就行。A类是1.0.0.0到126.255.255.255B类是128.0.0.0到191.255.255.255C类是192.0.0.0到223.255.255.255。2.3 操作系统与文件系统容易被忽略的角落操作系统的基本功能包括进程管理、内存管理、文件管理、设备管理。进程是程序的一次执行线程是进程内的执行单元。一个进程可以包含多个线程线程之间共享进程的内存空间。这个知识点经常考比如问下列关于进程和线程的说法正确的是哪个你要能判断出线程切换开销比进程小是对的。文件系统部分绝对路径和相对路径是常考点。绝对路径从根目录开始比如Windows下的C:\Users\test\file.txtLinux下的/home/test/file.txt。相对路径是相对于当前目录的路径比如./file.txt表示当前目录下的file.txt../file.txt表示上级目录下的file.txt。考试经常给一个目录结构图问你某个文件的相对路径怎么写这种题画个图就能理清楚。文件扩展名也要记住几个常见的.exe是可执行文件.txt是文本文件.cpp是C源文件.obj是目标文件.lib是静态库文件.dll是动态链接库文件。编译过程是源文件.cpp经过编译变成目标文件.obj再经过链接变成可执行文件.exe。这个流程经常考要能排序。3. 数据结构理解结构比背定义重要一百倍3.1 线性表数组、链表、栈、队列的本质区别数据结构这块很多人上来就背定义什么栈是后进先出队列是先进先出背得滚瓜烂熟但一到具体题目就懵。问题出在只背了结论没理解结构本身。我建议你从内存布局的角度去理解一旦想通了所有操作都能自己推出来。数组是一块连续的内存空间通过下标可以直接访问任意元素时间复杂度O(1)。但插入和删除需要移动元素平均时间复杂度O(n)。链表是一系列不连续的节点每个节点存数据和指向下一个节点的指针。访问第k个元素需要从头遍历时间复杂度O(n)但插入和删除只需要改指针时间复杂度O(1)。这个对比是必考的你要能说清楚为什么数组查得快、链表改得快。栈和队列是操作受限的线性表。栈只能在栈顶插入和删除所以是后进先出LIFO。队列只能在队尾插入、队头删除所以是先进先出FIFO。考试经常考的是给定一个入栈序列问可能的出栈序列有哪些。比如入栈顺序是1、2、3、4问哪个出栈序列是不可能的。这种题你就模拟一下1进1出、2进2出、3进3出、4进4出得到1、2、3、41进2进2出1出、3进3出、4进4出得到2、1、3、4等等。多练几道就能找到规律。循环队列是队列的变种用数组实现时队尾指针到达数组末尾后回到开头。循环队列需要判断队空和队满通常用frontrear表示队空(rear1)%sizefront表示队满。这个判断条件经常考要记清楚。3.2 树与二叉树从遍历方式反推结构树是CSP-J初赛的重头戏尤其是二叉树。二叉树每个节点最多有两个子节点分别叫左孩子和右孩子。二叉树的遍历方式有四种前序遍历根左右、中序遍历左根右、后序遍历左右根、层序遍历从上到下、从左到右。这四种遍历的递归实现必须会写因为阅读程序题经常考。前序遍历的递归写法void preorder(TreeNode* root) { if (root nullptr) return; cout root-val ; preorder(root-left); preorder(root-right); }中序和后序就是把输出语句换个位置这个不用死记理解根在哪个位置输出就行。前序是根在最前面中序是根在中间后序是根在最后面。考试经常给前序和中序让你求后序或者给后序和中序让你求前序。这种题有固定套路前序的第一个元素是根后序的最后一个元素是根中序中根的位置把序列分成左右子树。比如前序是ABDECFG中序是DBEAFCG那A是根中序中A左边是DBE右边是FCG。然后递归处理左右子树就能画出整棵树。这个技巧一定要练熟考试至少考一道。完全二叉树和满二叉树的概念也要清楚。满二叉树是每一层都填满的二叉树深度为k的满二叉树有2^k-1个节点。完全二叉树是除了最后一层外都填满且最后一层的节点都靠左排列。完全二叉树可以用数组存储下标从1开始节点i的左孩子是2i右孩子是2i1父节点是i/2。这个性质经常考比如问你一个完全二叉树有100个节点深度是多少。2^6-1632^7-1127所以深度是7。3.3 图的基本概念顶点、边、度、连通性图由顶点和边组成分为有向图和无向图。无向图中顶点的度是与之相连的边的数量。有向图中分为入度和出度入度是指向该顶点的边数出度是从该顶点出发的边数。所有顶点的度数之和等于边数的两倍这个性质经常考。连通图是指图中任意两个顶点之间都有路径。无向图中如果任意两个顶点都连通就是连通图。有向图中如果任意两个顶点之间都有双向路径就是强连通图。连通分量是无向图中的极大连通子图强连通分量是有向图中的极大强连通子图。图的存储方式有邻接矩阵和邻接表。邻接矩阵是一个二维数组matrix[i][j]表示顶点i到顶点j是否有边。邻接矩阵适合稠密图空间复杂度O(n^2)。邻接表是每个顶点存一个链表记录与之相连的顶点。邻接表适合稀疏图空间复杂度O(ne)。这个对比经常考要能根据图的稠密程度选择合适的存储方式。图的遍历有深度优先搜索DFS和广度优先搜索BFS。DFS用栈实现或者递归BFS用队列实现。DFS适合找路径、判断连通性BFS适合找最短路径无权图。这两种遍历的代码要会写阅读程序题经常考。4. 算法基础排序、查找、递归、贪心、动态规划4.1 排序算法复杂度、稳定性、适用场景排序是初赛必考的内容没有之一。冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序这六种排序的原理、时间复杂度、空间复杂度、稳定性都要清楚。冒泡排序相邻元素比较大的往后冒。每一轮把最大的元素放到最后。时间复杂度O(n^2)空间复杂度O(1)稳定。选择排序每一轮找最小的元素放到前面。时间复杂度O(n^2)空间复杂度O(1)不稳定。插入排序把元素插入到已排序序列的合适位置。时间复杂度O(n^2)空间复杂度O(1)稳定。这三种是基础排序代码要会写。快速排序选一个基准元素把比它小的放左边比它大的放右边然后递归处理左右两边。平均时间复杂度O(nlogn)最坏O(n^2)空间复杂度O(logn)不稳定。快速排序的关键是基准的选择选得不好会退化。归并排序把数组分成两半分别排序然后合并。时间复杂度O(nlogn)空间复杂度O(n)稳定。归并排序的合并操作是重点阅读程序题经常考。堆排序利用堆的性质排序。建堆O(n)每次取堆顶O(logn)总共O(nlogn)。空间复杂度O(1)不稳定。堆排序的调整过程经常考要理解下沉和上浮操作。排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序O(n^2)O(n^2)O(1)稳定选择排序O(n^2)O(n^2)O(1)不稳定插入排序O(n^2)O(n^2)O(1)稳定快速排序O(nlogn)O(n^2)O(logn)不稳定归并排序O(nlogn)O(nlogn)O(n)稳定堆排序O(nlogn)O(nlogn)O(1)不稳定这个表格建议默写下来考试直接对照。稳定性是指相等的元素排序后相对位置不变。比如序列5a、3、5b、1排序后如果是1、3、5a、5b就是稳定的如果是1、3、5b、5a就是不稳定的。这个定义要理解不要死记。4.2 查找算法顺序查找与二分查找顺序查找就是从头到尾遍历时间复杂度O(n)。二分查找是在有序数组中查找每次比较中间元素排除一半。时间复杂度O(logn)。二分查找的代码要会写注意边界条件。int binarySearch(int arr[], int n, int target) { int left 0, right n - 1; while (left right) { int mid left (right - left) / 2; if (arr[mid] target) return mid; else if (arr[mid] target) left mid 1; else right mid - 1; } return -1; }二分查找的坑在于mid的计算用(leftright)/2可能会溢出所以写成left(right-left)/2。这个细节经常考要注意。另外二分查找要求数组必须有序这个前提条件不能忘。4.3 递归与分治理解调用栈是关键递归是函数自己调用自己必须有终止条件。递归的执行过程可以用调用栈来理解。比如计算阶乘int factorial(int n) { if (n 1) return 1; return n * factorial(n - 1); }调用factorial(5)时会依次调用factorial(4)、factorial(3)、factorial(2)、factorial(1)然后依次返回。调用栈从下到上是factorial(5)、factorial(4)、factorial(3)、factorial(2)、factorial(1)。这个栈的变化过程经常考要能画出来。分治是把大问题分成小问题分别解决后合并。归并排序和快速排序都是分治思想。分治的时间复杂度分析用主定理但初赛考得浅知道T(n)2T(n/2)O(n)对应O(nlogn)就行。4.4 贪心与动态规划入门理解思想比写代码重要贪心算法是每一步都选当前最优的希望最终得到全局最优。但贪心不一定能得到最优解比如背包问题贪心选性价比最高的物品可能不是最优。贪心能解决的问题必须满足贪心选择性质和最优子结构。动态规划是把问题分成子问题保存子问题的解避免重复计算。动态规划的关键是状态定义和状态转移方程。比如斐波那契数列用动态规划就是dp[i]dp[i-1]dp[i-2]。初赛考动态规划一般不会太难主要是理解思想能看懂简单的状态转移方程。提示贪心和动态规划的区别是贪心每步做决定后不回头动态规划会保存所有可能的状态。考试经常考下列哪个问题适合用贪心/动态规划你要能判断。5. 数学逻辑与复杂度分析别让数学拖后腿5.1 排列组合与概率公式要会用排列组合是初赛数学部分的重点。排列是有顺序的组合是无顺序的。从n个不同元素中取m个排列公式是P(n,m)n!/(n-m)!。组合是C(n,m)n!/(m!(n-m)!)。这两个公式要记牢。比如从5个人中选3个人排成一排有多少种排法P(5,3)5×4×360。从5个人中选3个人组成一个小组有多少种选法C(5,3)10。这种题不难但要注意区分排列和组合。概率部分古典概型是P(A)A包含的基本事件数/总基本事件数。比如掷两个骰子点数和为7的概率是多少总共有36种情况和为7的情况有(1,6)、(2,5)、(3,4)、(4,3)、(5,2)、(6,1)共6种所以概率是6/361/6。这种题画个表就能算。5.2 时间复杂度分析大O记号要会算时间复杂度是初赛必考的内容。大O记号表示算法的渐进复杂度只保留最高阶项去掉系数。比如3n^22n1时间复杂度是O(n^2)。常见的时间复杂度从小到大排列O(1)O(logn)O(n)O(nlogn)O(n^2)O(n^3)O(2^n)O(n!)。分析代码的时间复杂度就看循环的次数。一层循环是O(n)两层嵌套是O(n^2)三层是O(n^3)。二分查找是O(logn)因为每次排除一半。归并排序是O(nlogn)因为分成logn层每层合并O(n)。递归的时间复杂度分析稍微复杂一点。比如斐波那契数列的朴素递归int fib(int n) { if (n 1) return n; return fib(n-1) fib(n-2); }这个递归的时间复杂度是O(2^n)因为每次调用分成两个分支。如果加个记忆化数组就变成O(n)。这个对比经常考。5.3 逻辑推理真假话问题有套路逻辑推理题通常给几个人说话其中有人说真话有人说假话让你判断谁说的是真的。这种题用假设法假设某个人说真话看是否矛盾。比如三个人A说B在说谎B说C在说谎C说A和B都在说谎。假设A说真话那B在说谎B说C在说谎就是假的所以C说真话。C说A和B都在说谎就是假的因为A说真话。矛盾所以A说假话。然后假设B说真话那C在说谎C说A和B都在说谎是假的符合。A说B在说谎是假的也符合。所以B说真话A和C说假话。这种题多练几道就有感觉了。6. 阅读程序与完善程序初赛拉分的关键战场6.1 阅读程序题先看整体结构再看细节阅读程序题给一段代码让你判断输出或者填空。很多人一上来就逐行读读到后面忘了前面。我的建议是先看整体结构有没有循环、有没有递归、有没有数组操作。然后看输入输出确定程序在干什么。最后再逐行分析。比如给一段冒泡排序的代码问你排序后数组是什么。你不需要逐行模拟只要知道冒泡排序是把大的往后冒就能直接写出结果。再比如给一段递归代码问你递归深度是多少你只要看递归的终止条件和每次递归的参数变化就能算出来。阅读程序题经常考的是边界条件。比如循环是从0到n-1还是从1到n数组下标是从0开始还是从1开始。这些细节决定输出结果一定要看清楚。6.2 完善程序题根据上下文推断缺失部分完善程序题给一段不完整的代码让你填缺失的部分。这种题比阅读程序题难因为你要理解程序的意图。我的方法是先看题目描述知道程序要干什么。然后看代码的整体结构确定缺失部分的功能。最后根据上下文推断应该填什么。比如题目说用二分查找在有序数组中查找目标值代码中缺失了mid的计算和边界的更新。你就根据二分查找的模板填上midleft(right-left)/2以及leftmid1或rightmid-1。这种题只要模板熟练基本不会错。完善程序题经常考的是循环条件和变量更新。比如for循环的终止条件while循环的退出条件变量的自增自减。填完之后要代入验证一下看逻辑是否通顺。注意完善程序题每空3分一共10空左右占了30分。这部分是初赛的大头必须重点练习。建议把近五年的真题都做一遍总结常考的题型和填空方式。7. 零基础冲刺的复习节奏与实战建议7.1 复习时间分配别把时间浪费在冷门知识点上如果你现在零基础距离初赛还有一个月我建议你这样分配时间第一周把计算机基础和进制转换搞定这部分是送分题必须拿满。第二周集中攻克数据结构和算法基础这是大头至少要占一半时间。第三周练阅读程序和完善程序每天做两套真题。第四周查漏补缺把错题重新做一遍。如果你只有两周时间那就直接刷真题。近五年的真题至少做三遍第一遍按知识点分类做第二遍按套卷做第三遍只做错题。真题是最好的复习资料没有之一。模拟题可以做但不要沉迷真题的套路才是最重要的。7.2 考场技巧先易后难该放弃就放弃初赛的题目难度不是递增的有时候后面的题反而简单。所以做题顺序很重要。我的建议是先做单选题再做判断题然后做阅读程序题最后做完善程序题。单选题和判断题是基础分必须拿稳。阅读程序题如果看不懂可以先跳过做完后面的再回来。遇到不会的题不要死磕。初赛是选择题实在不会就蒙一个不要空着。蒙的时候也有技巧排除明显错误的选项在剩下的里面选。比如问你时间复杂度O(n^2)和O(nlogn)选一个如果你知道程序有两层循环那就选O(n^2)。提示初赛的通过分数线一般在60到70分之间不同省份不一样。你不需要考满分只要过线就行。所以策略是基础题不丢分难题能拿几分拿几分。7.3 常见坑点汇总这些错误千万别犯第一个坑是进制转换算错。特别是十六进制和二进制之间的转换容易搞混。建议在草稿纸上写清楚每一位不要心算。第二个坑是排序算法的稳定性记反。冒泡、插入、归并是稳定的选择、快速、堆是不稳定的。这个要背熟。第三个坑是二叉树遍历搞混。前序是根左右中序是左根右后序是左右根。画个图就能记住。第四个坑是时间复杂度分析漏掉循环。比如两层循环里面还有个O(logn)的操作总复杂度是O(n^2logn)不是O(n^2)。第五个坑是阅读程序题看错边界。循环是从0开始还是从1开始数组下标是从0还是从1这些细节决定答案。第六个坑是完善程序题填错变量名。填完之后要检查变量是否定义过类型是否匹配。这些坑我见过太多学生踩你只要在考前把这些点过一遍就能避免大部分低级错误。7.4 真题实战以2023年CSP-J初赛为例2023年CSP-J初赛有一道题考的是归并排序的合并过程。题目给了一个数组让你写出归并排序每一轮合并后的结果。这种题如果你理解归并排序的原理直接模拟就行。归并排序是先分成单个元素然后两两合并再四四合并直到整个数组有序。你只要按照这个流程走一遍就能写出答案。还有一道题考的是完全二叉树的性质。题目说一个完全二叉树有1000个节点问叶子节点有多少个。完全二叉树的叶子节点数等于节点总数减去非叶子节点数。非叶子节点数是节点总数除以2向下取整也就是500。所以叶子节点是1000-500500个。这种题用公式直接算不要画图。阅读程序题考了一道递归的题代码是计算斐波那契数列的第n项。题目问当n5时函数被调用了多少次。这种题画个递归树就能算出来。fib(5)调用fib(4)和fib(3)fib(4)调用fib(3)和fib(2)以此类推。总共调用次数是15次。这种题多练几道就能快速算出来。完善程序题考了一道二分查找的题缺失的部分是mid的计算和边界的更新。这种题只要背过二分查找的模板直接填就行。注意mid要用left(right-left)/2避免溢出。7.5 最后的冲刺建议刷题、总结、模拟考前一周不要再学新知识点了把已经学过的巩固好就行。每天做一套真题限时120分钟模拟真实考试环境。做完之后认真分析错题把错题对应的知识点重新复习一遍。考前三天把所有的公式、模板、易错点过一遍。进制转换的公式、排序算法的复杂度表、二叉树遍历的口诀、二分查找的模板这些都要烂熟于心。考前一天早点休息不要熬夜。初赛是笔试精神状态很重要。考试当天带好准考证、身份证、笔和草稿纸。草稿纸要多带几张进制转换和递归树都需要大量草稿。我在实际教学中发现很多学生不是不会而是粗心。明明会做的题因为看错题目或者算错数丢了分。所以考试时一定要仔细审题做完之后如果有时间把不确定的题再检查一遍。最后再分享一个小技巧初赛的选择题如果实在不会就选那个看起来最长的选项。根据我的统计这个策略的正确率在40%左右比随机蒙的25%高不少。当然这只是最后的救命稻草能自己算出来最好自己算。初赛其实不难难的是你有没有系统复习。把上面这些知识点都过一遍真题做三遍过线基本没问题。祝你顺利通过初赛复赛见。
返回列表