科普类资源清单![]() |
|---|
| 🤞信奥业余科普 |

GESP学习资源清单

| 一级真题解析 | 一级练习题清单 | 111-8级全考纲解析 |
| 二级真题解析 | 二级练习题清单 | GESP/CSP必备技能 |
| 三级真题解析 | 三级练习题清单 | 考纲解密 |
| 四级真题解析 | 四级练习题清单 | 资源汇总/经验交流 |
| 五级真题解析 | 五级练习题清单 | |
| 六级真题解析 | 六级练习题清单 |

CSP学习资源清单

| 2025辽宁CSP-XL复赛真题解析 | CSP-J 编程题真题解析 |

NOI学习资源清单

| 1998年真题解析 |
| 1999年真题解析 |
| 2001年真题解析 |
| 2011年真题解析 |
2022 年 CCF 非专业级软件能力认证(CSP-J/S 2022)第一轮认证于 2022 年 9 月 18 日举行。
本文为您带来 CSP-J 2022 第一轮真题解析(一):单项选择题(共 15 题,每题 2 分,共计 30 分) 的原题还原、选项剖析与深度考点解析,涵盖 C++ 基础语法、数据结构、进制转换、哈夫曼编码、排序算法 等核心知识点。
📌 一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
第 1 题
原题:以下哪种功能没有涉及 C++ 语言的面向对象特性支持:( )。A. C++ 中调用
printf函数B. C++ 中调用用户定义的类成员函数C. C++ 中构造一个class或structD. C++ 中构造来源于同一基类的多个派生类
正确答案: A
深度解析:本题考查 C++ 的 面向对象特性。
printf是 C 语言的输入输出库函数,属于面向过程的函数调用,并没有涉及面向对象的特性(如封装、继承、多态)。B、C、D 选项分别涉及了类的成员函数、类的定义以及类的继承派生,都是典型的面向对象特性。
第 2 题
原题:有 6 个元素,按照 6, 5, 4, 3, 2, 1 的顺序进入栈 S,请问下列哪个出栈序列是非法的( )。A. 5, 4, 3, 6, 1, 2B. 4, 5, 3, 1, 2, 6C. 3, 4, 6, 5, 2, 1D. 2, 3, 4, 1, 5, 6
正确答案: C
深度解析:本题考查 栈的后进先出(LIFO)特性。根据进栈顺序 6, 5, 4, 3, 2, 1 逐个模拟:
A 项:6, 5 进,5 出;4 进,4 出;3 进,3 出;此时栈顶是 6,6 出;2, 1 进,1 出,2 出。合法。 B 项:6, 5, 4 进,4 出;此时栈顶是 5,5 出;3 进,3 出;2, 1 进,1 出,2 出;最后栈顶是 6,6 出。合法。 C 项:6, 5, 4, 3 进,3 出;此时栈顶是 4,4 出;此时栈顶应该是 5。但选项中下一个出栈的是 6,而 6 在 5 的下面,无法越过 5 直接出栈。非法。 D 项:6, 5, 4, 3, 2 进,2 出;此时栈顶是 3,3 出;栈顶是 4,4 出;1 进,1 出;此时栈顶是 5,5 出;最后 6 出。合法。
第 3 题
原题:运行以下代码片段的行为是( )。
int x = 101;int y = 201;int *p = &x;int *q = &y;p = q;A. 将 x 的值赋为 201B. 将 y 的值赋为 101C. 将 q 指向 x 的地址D. 将 p 指向 y 的地址
正确答案: D
深度解析:本题考查 指针的基本赋值操作: 代码中 p 和 q 都是指针变量。q 存储的是 y 的地址。 执行 p = q; 即把 q 中存储的地址赋值给 p,因此 p 也变成了指向 y 的地址,并不会改变 x 或 y 变量本身的值。
第 4 题
原题:链表和数组的区别包括( )。A. 数组不能排序,链表可以B. 链表比数组能存储更多的信息C. 数组大小固定,链表大小可动态调整D. 以上均正确
正确答案: C
深度解析:本题考查 数组与链表的基本性质:
A 选项错误:数组和链表都可以进行排序操作(如数组使用快排,链表使用归并排序)。 B 选项错误:存储信息的容量取决于可用内存,并不存在链表必定比数组能存储更多信息的说法,且链表为了维护结构还需要额外的空间存储指针。 C 选项正确:普通数组在声明时必须指定大小且大小不可变(静态分配内存连续);而链表可以利用指针动态分配内存,大小可随时动态调整。
第 5 题
原题:对假设栈 S 和队列 Q 的初始状态为空。存在 e1 ~ e6 六个互不相同的数据,每个数据按照进栈 S、出栈 S、进队列 Q、出队列 Q 的顺序操作,不同数据间的操作可能会交错。已知栈 S 中依次有数据 e1、e2、e3、e4、e5 和 e6 进栈,队列 Q 依次有数据 e2、e4、e3、e6、e5 和 e1 出队列。则栈 S 的容量至少是( )个数据。A. 2B. 3C. 4D. 6
正确答案: B
深度解析:本题考查 栈与队列的性质及混合模拟。 队列 Q 是先进先出,所以出队列的顺序也就是进队列的顺序。根据题意,数据是先出栈再进队列,因此队列的出队顺序其实就等同于栈的出栈顺序。 已知入栈顺序为:e1, e2, e3, e4, e5, e6。出栈顺序为:e2, e4, e3, e6, e5, e1。 我们模拟栈的操作过程,计算栈中最大元素个数:
进 e1 (栈中元素:e1,共 1 个) 进 e2 (栈中元素:e1, e2,共 2 个) 出 e2 (栈中元素:e1,共 1 个) 进 e3 (栈中元素:e1, e3,共 2 个) 进 e4 (栈中元素:e1, e3, e4,共 3 个) <-- 此时达到最大容量 3 出 e4 (栈中元素:e1, e3,共 2 个) 出 e3 (栈中元素:e1,共 1 个) 进 e5 (栈中元素:e1, e5,共 2 个) 进 e6 (栈中元素:e1, e5, e6,共 3 个) <-- 再次达到最大容量 3 出 e6 (栈中元素:e1, e5,共 2 个) 出 e5 (栈中元素:e1,共 1 个) 出 e1 (栈空)
模拟过程中,栈内同时存在的最大元素个数为 3,因此栈的容量至少是 3。
第 6 题
原题:对表达式
a+(b-c)*d的前缀表达式为( ),其中+、-、*是运算符。A.*+a-bcdB.+a*-bcdC.abc-d*+D.abc-+d
正确答案: B
深度解析:本题考查 中缀表达式转前缀表达式。 转换可以借助表达式树(或括号法):a + ((b - c) * d)
(b - c)的前缀为:- b c(b - c) * d的前缀为:* - b c da + 上述结果的前缀为:+ a * - b c d最终结果:+a*-bcd。
第 7 题
原题:假设字母表
{a, b, c, d, e}在字符串出现的频率分别为 10%, 15%, 30%, 16%, 29%。若使用哈夫曼编码方式对字母进行不定长的二进制编码,字母d的编码长度( )位。A. 1B. 2C. 2 或 3D. 3
正确答案: B
深度解析:本题考查 哈夫曼树的构造过程: 初始频率:a(10), b(15), d(16), e(29), c(30)。
取最小的两个 a(10) 和 b(15) 合并,得到新节点 25。剩余权重:16, 25, 29, 30。 取最小的两个 d(16) 和 25 合并,得到新节点 41。剩余权重:29, 30, 41。 取最小的两个 e(29) 和 c(30) 合并,得到新节点 59。剩余权重:41, 59。 将最后的 41 和 59 合并为根节点 100。
推导各字符在哈夫曼树中的深度:
根节点 100 有两个子节点 41 和 59。 41 的子节点为 d(16) 和 25。因此 d 位于树的第 2 层(深度为 2)。 d 的哈夫曼编码长度为 2 位。
第 8 题
原题:一棵有 个结点的完全二叉树用数组进行存储与表示,已知根结点存储在数组的第 1 个位置。若存储在数组第 9 个位置的结点存在兄弟结点和两个子结点,则它的兄弟结点和右子结点的位置分别是( )。A. 8、18B. 10、18C. 8、19D. 10、19
正确答案: C
深度解析:本题考查 完全二叉树的数组顺序存储性质。 对于存储在数组下标 的结点(根节点下标为 1):
左子结点下标为 右子结点下标为 父结点下标为
题目中指定结点位置为 :
其父结点位置为 。 父结点 4 的两个孩子分别是 和 。因此 9 的左兄弟结点位置为 8。 结点 9 的右子结点位置为 。
兄弟结点为 8,右子结点为 19。
第 9 题
原题:考虑由 个顶点构成的有向连通图,采用邻接矩阵的数据结构表示时,该矩阵中至少存在( )个非零元素。A. B. C. D.
正确答案: B
深度解析:本题考查 有向图的连通性与邻接矩阵。 在图论中,“有向连通图”通常指的是 强连通图(即任意两个顶点互相可达)。 为了构成一个包含 个顶点的强连通图,最少需要用 条有向边构成一个包含所有顶点的大环。 每一条有向边在邻接矩阵中对应一个非零元素。因此至少需要 条边,对应邻接矩阵中至少存在 个非零元素。
第 10 题
原题:以下对数据结构的表述不恰当的一项为:( )。A. 图的深度优先遍历算法常使用的数据结构为栈。B. 栈的访问原则后进先出,队列的访问原则是先进先出。C. 队列常常被用于广度优先搜索算法。D. 栈与队列存在本质不同,无法用栈实现队列。
正确答案: D
深度解析:本题考查 基础数据结构特性。
A 项正确,DFS(深度优先搜索)本质是递归,底层使用系统调用栈;也可以手动使用栈来非递归实现。 B、C 项均正确描述了栈、队列的基本原则及典型应用场景(队列用于 BFS)。 D 项错误!我们可以使用两个栈来模拟实现一个队列的全部功能(一个专门负责入栈,一个专门负责出栈处理)。因此“无法用栈实现队列”的说法是错误的。
第 11 题
原题:以下哪组操作能完成在双向循环链表结点
p之后插入结点s的效果(其中,next域为结点的直接后继,prev域为结点的直接前驱):( )。A.p->next->prev=s; s->prev=p; p->next=s; s->next=p->next;B.p->next->prev=s; p->next=s; s->prev=p; s->next=p->next;C.s->prev=p; s->next=p->next; p->next=s; p->next->prev=s;D.s->next=p->next; p->next->prev=s; s->prev=p; p->next=s;
正确答案: D
深度解析:本题考查 双向链表的结点插入操作顺序。 假设 p 的原后继结点为 q(即 p->next)。我们需要在 p 和 q 之间插入 s。为避免丢失 q 的指针,关键是在修改 p->next 之前,必须先处理好与原后继结点的连接。 分析 D 选项的操作:
s->next=p->next;将s的后继指向原来的q。p->next->prev=s;将原来q的前驱指向s。s->prev=p;将s的前驱指向p。p->next=s;最后,将p的后继指向s。 整个顺序逻辑严密,没有任何指针丢失的错误。A 和 C 选项中在赋值p->next=s之后,又使用了p->next,导致逻辑谬误。
第 12 题
原题:以下排序算法的常见实现中,哪个选项的说法是错误的:( )。A. 冒泡排序算法是稳定的B. 简单选择排序是稳定的C. 简单插入排序是稳定的D. 归并排序算法是稳定的
正确答案: B
深度解析:本题考查 十大排序算法的稳定性: 排序算法的“稳定性”是指:相等的元素在排序后,相对顺序保持不变。
冒泡排序、简单插入排序、归并排序均可以通过严谨的边界判断做到稳定。 简单选择排序是不稳定的。例如序列 [5, 5, 2],第一趟寻找最小值2并与第一个位置交换,序列变为[2, 5, 5],导致原来两个5的相对位置被破坏。
第 13 题
原题:八进制数 32.1 对应的十进制数是( )。A. 24.125B. 24.250C. 26.125D. 26.250
正确答案: C
深度解析:本题考查 带小数的进制转换。 将八进制 按权展开转为十进制:
整数部分 小数部分 两者相加为 。
第 14 题
原题:一个字符串中任意个连续的字符组成的子序列称为该字符串的子串,则字符串
abcab有( )个内容互不相同的子串。A. 12B. 13C. 14D. 15
正确答案: B
深度解析:本题考查 字符串子串及去重计算。 我们按子串长度枚举:
长度 0(空串): ""(1个)长度 1: a,b,c(去重后 3个)长度 2: ab,bc,ca(去重后 3个,末尾的ab与前面重复)长度 3: abc,bca,cab(3个)长度 4: abca,bcab(2个)长度 5: abcab(1个) 总计: 个。
第 15 题
原题:以下对递归方法的描述中,正确的是:( )。A. 递归是允许使用多组参数调用函数的编程技术B. 递归是通过调用自身来求解问题的编程技术C. 递归是面向对象和数据而不是功能和逻辑的编程语言模型D. 递归是将用某种高级语言转换为机器代码的编程技术
正确答案: B
深度解析:本题考查 递归编程基础概念。 递归的本质特征就是函数在执行过程中直接或间接地调用自身。
A 是函数重载/多态的特点。 C 描述的是面向对象编程(OOP)模型。 D 描述的是编译/解释技术。 因此正确答案选 B。
💡 总结
CSP-J 2022 第一轮选择题覆盖的知识点相对经典且基础:
栈与队列:是近几年考察的极高频考点,不仅要了解其进出原则,还需要熟练应对交错出入栈的手算推演模拟(如第 2、5 题)。 树与二叉树:哈夫曼编码与完全二叉树的数组下标运算是老生常谈的题目,必须熟练掌握。 指针与链表:双向链表的插入需要极度注重顺序逻辑防“断链”(第 11 题)。 基础数据:各种排序稳定性及进制小数转换不可丢分。
预祝各位考生在备考中夯实基础,稳中求胜!
【推荐】:【GESP】C++ 认证学习资源汇总(2026年3月更新)
【推荐】:GESP/CSP/NOI资料站:https://wiki.coderli.com/
【推荐】GESP/CSP学习交流群

“luogu-”系列题目可在洛谷题库进行在线评测。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
夜雨聆风
科普类资源清单
11