







2023 年 CCF 非专业级软件能力认证(CSP-J/S 2023)第一轮认证于 2023 年 9 月 16 日举行。
本文为您带来 CSP-J 2023 第一轮真题解析(一):单项选择题(共 15 题,每题 2 分,共计 30 分) 的原题还原、选项剖析与深度考点解析,涵盖 C++ 基础语法、数据结构、组合数学、进制转换、哈夫曼编码、图论拓扑排序 等核心知识点。
原题:
在 C++ 中,下面哪个关键字用于声明一个变量,其值不能被修改?
A.unsigned
B.const
C.static
D.mutable
正确答案: B
深度解析:
本题考查 C++ 的关键字功能与变量修饰符:
const(常量修饰符):用于声明一个只读变量/常量。一旦初始化后,其值就不能再被修改。若尝试修改 const 变量,编译器将抛出编译错误。unsigned(无符号修饰符):表示无符号整数类型(非负数),扩展了正数表示范围,但不限制值是否可修改。static(静态修饰符):限定变量的生存期为整个程序运行期间,以及控制链接属性/作用域,值依然可以被修改。mutable(可变修饰符):专门用于修饰类的成员变量,使得该成员变量即使在 const 成员函数中也可以被修改。原题:
八进制数 $12345670_8$ 和 $07654321_8$ 的和为( )
A. $22222221_8$
B. $21111111_8$
C. $22111111_8$
D. $22222211_8$
正确答案: D
深度解析:
本题考查 八进制加法运算。八进制下的加法规则为 “逢 8 进 1”。
我们进行竖式逐位相加(从右往左):
1
2
3
1 2 3 4 5 6 7 0 (8)
+ 0 7 6 5 4 3 2 1 (8)
---------------------
计算结果为 $22222211_8$,对应 D 选项。
原题:
阅读下述代码,请问修改data的value成员以存储 3.14,正确的方式是( )
1 2 3 4 5 6 union Data{ int num; float value; char symbol; }; union Data data;A.
data.value = 3.14;
B.value.data = 3.14;
C.data -> value = 3.14;
D.value->data = 3.14;
正确答案: A
深度解析:
本题考查 C++ 中 联合体(union)实例成员的访问方式:
data 是一个 union Data 类型的变量(普通对象),并非指针。.),语法结构为:对象名.成员名。因此正确修改方式为 data.value = 3.14;。union Data* p)时,才使用箭头运算符 p->value。知识扩展:
union(联合体)的所有成员共享同一块内存空间,其总内存大小等于最大成员的大小。赋值data.value会覆盖之前存放在data中的其他成员数据。
原题:
假设有一个链表的节点定义如下:
1 struct Node { int data; Node* next; };现在有一个指向链表头部的指针:
Node* head。如果想要在链表中插入一个新节点,使其成员data的值为 42,并使新节点成为链表的第一个节点,下面哪个操作是正确的?( )
A.Node* newNode = new Node; newNode->data = 42; newNode->next = head; head = newNode;
B.Node* newNode = new Node; head->data = 42; newNode->next = head; head = newNode;
C.Node* newNode = new Node; newNode->data = 42; head->next = newNode;
D.Node* newNode = new Node; newNode->data = 42; newNode->next = head;
正确答案: A
深度解析:
本题考查单链表的 头插法(前插法) 步骤:
要在链表头部插入一个值为 42 的新节点,标准步骤为:
Node* newNode = new Node;newNode->data = 42;newNode->next = head;head = newNode;完整连起来即为 A 选项的代码。
选项错因分析:
head->data = 42,篡改了原头节点的数据且未设置新节点数值。head->next 指向新节点,破坏了原本的后续链表结构。head = newNode;,新节点未能真正成为新的头节点。原题:
根节点的高度为 1,一棵拥有 2023 个节点的三叉树高度至少为( )
A. 6
B. 7
C. 8
D. 9
正确答案: C
深度解析:
本题考查 多叉树的高度与节点数关系。
为了使高度至少(即尽可能小),该三叉树必须是完全/满三叉树(每一层都尽可能填满)。
对于一棵高度为 $h$ 的满三叉树,各层节点数依次为:
高度为 $h$ 的满三叉树能容纳的最大节点总数 $N(h)$ 为等比数列求和: \(N(h) = 1 + 3 + 3^2 + \dots + 3^{h-1} = \frac{3^h - 1}{3 - 1} = \frac{3^h - 1}{2}\)
我们逐个代入选项计算最大节点容量:
因为 $1093 < 2023 \le 3280$,所以要容纳 2023 个节点,三叉树的高度至少为 8。
原题:
小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,但他希望任意两个练习的时间段之间都有至少两个空闲的时间段让他休息。则小明一共有( )种选择时间段的方案。
A. 31
B. 18
C. 21
D. 33
正确答案: B
深度解析:
本题考查 组合数学与分类讨论 / 插空思想。
设 7 个时间段编号为 $1, 2, 3, 4, 5, 6, 7$。选出的练习时间段之间必须至少间隔 $2$ 个未选的时间段。
我们按选出的练习时间段数量 $k$($k \ge 1$)进行分类讨论:
当选择 $k = 1$ 个时间段时:
可以在 7 个时间段中任意选择 1 个,共有 $\binom{7}{1} = 7$ 种方案。
当选择 $k = 3$ 个时间段时:
选 3 个时间段至少需要占用的长度为:选 1 个 + 隔 2 个 + 选 1 个 + 隔 2 个 + 选 1 个 = $1 + 2 + 1 + 2 + 1 = 7$ 个时间段。
刚好占用完所有 7 个时间段,因此只有唯一一种组合方案,即选择 ${1, 4, 7}$,方案数为 $1$ 种。
总方案数 $= 7 + 10 + 1 = 18$ 种。
原题:
以下关于高精度运算的说法错误的是( )
A. 高精度计算主要是用来处理大整数或需要保留多位小数的运算
B. 大整数除以小整数的处理的步骤可以是,将被除数和除数对齐,从左到右逐位尝试将除数乘以某个数,通过减法得到新的被除数,并累加商
C. 高精度乘法的运算时间只与参与运算的两个整数中长度较长者的位数有关
D. 高精度加法运算的关键在于逐位相加并处理进位
正确答案: C
深度解析:
本题考查 高精度算法的概念与时间复杂度:
long long 或 double 的精度极限)时,必须使用高精度计算(通常用数组或字符串模拟)。carry。题目要求选择说法错误的选项,故选 C。
原题:
后缀表达式6 2 3 + - 3 8 2 / + * 2 ^ 3 +对应的中缀表达式是( )
A.((6-(2+3))*(3+8/2))^2+3
B.6-2+3*3+8/2^2+3
C.(6-(2+3))*((3+8/2)^2)+3
D.6-((2+3)*(3+8/2))^2+3
正确答案: A
深度解析:
本题考查 后缀表达式(逆波兰表达式)转换为中缀表达式。
我们使用栈模拟表达式转换过程(从左往右扫描):
6, 2, 3 入栈 $\rightarrow$ 栈内容:[6, 2, 3]+:弹出 3 和 2,组合为 (2 + 3) 入栈 $\rightarrow$ 栈内容:[6, (2 + 3)]-:弹出 (2 + 3) 和 6,组合为 (6 - (2 + 3)) 入栈 $\rightarrow$ 栈内容:[(6 - (2 + 3))]3, 8, 2 $\rightarrow$ 栈内容:[(6 - (2 + 3)), 3, 8, 2]/:弹出 2 和 8,组合为 (8 / 2) 入栈 $\rightarrow$ 栈内容:[(6 - (2 + 3)), 3, (8 / 2)]+:弹出 (8 / 2) 和 3,组合为 (3 + 8 / 2) 入栈 $\rightarrow$ 栈内容:[(6 - (2 + 3)), (3 + 8 / 2)]*:弹出两个子式,组合为 ((6 - (2 + 3)) * (3 + 8 / 2)) 入栈2 入栈,随后遇到 ^(乘方):弹出 2 和前式,组合为 ((6 - (2 + 3)) * (3 + 8 / 2)) ^ 2 入栈3 入栈,随后遇到 +:组合为 ((6 - (2 + 3)) * (3 + 8 / 2)) ^ 2 + 3对比选项,完美对应 A 选项。
原题:
数 $1010102$ 和 $166_8$ 的和为( )
A. $(10110000)_2$
B. $(236)_8$
C. $(158){10}$
D. $(A0)_{16}$
正确答案: D
深度解析:
本题考查 不同进制数之间的转换与加法运算。
最稳妥的求解方式是将各进制数统一转换为 十进制 进行运算:
将 $101010_2$ 转为十进制:
\(101010_2 = 1 \times 2^5 + 0 \times 2^4 + 1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 0 \times 2^0 = 32 + 8 + 2 = 42_{10}\)
将 $166_8$ 转为十进制:
\(166_8 = 1 \times 8^2 + 6 \times 8^1 + 6 \times 8^0 = 64 + 48 + 6 = 118_{10}\)
求两数十进制之和:
\(42_{10} + 118_{10} = 160_{10}\)
校验各选项对应的十进制值:
因此正确答案为 D。
原题:
假设有一组字符{a, b, c, d, e, f},对应的频率分别为5%, 9%, 12%, 13%, 16%, 45%。请问以下哪个选项是字符a,b,c,d,e,f分别对应的一组哈夫曼编码?( )
A.1111, 1110, 101, 100, 110, 0
B.1010, 1001, 1000, 011, 010, 00
C.000, 001, 010, 011, 10, 11
D.1010, 1011, 110, 111, 00, 01
正确答案: A
深度解析:
本题考查 哈夫曼树(Huffman Tree)的构建与前缀码性质。
哈夫曼树的构建过程(每次挑选权值最小的两个节点合并):
a:5%, b:9%, c:12%, d:13%, e:16%, f:45%a(5) 和 b(9) $\rightarrow$ 得到新节点 (14)c(12), d(13), (14), e(16), f(45)c(12) 和 d(13) $\rightarrow$ 得到新节点 (25)(14), e(16), (25), f(45)(14) 和 e(16) $\rightarrow$ 得到新节点 (30)(25), (30), f(45)(25) 和 (30) $\rightarrow$ 得到新节点 (55)(55) 和 f(45) $\rightarrow$ 得到根节点 (100)推导各字符在树中的深度(编码长度):
f 频率最高(45%),直接连在根节点下 $\rightarrow$ 编码长度为 1c(12) 和 d(13) 在 (25) 节点下 $\rightarrow$ 编码长度为 3e(16) 在 (30) 节点下 $\rightarrow$ 编码长度为 3a(5) 和 b(9) 在最底层的 (14) 节点下 $\rightarrow$ 编码长度为 4字符 a,b,c,d,e,f 对应的编码长度应依次为 4, 4, 3, 3, 3, 1。
检查各选项编码长度:
c 的编码 1000 长度为 4,与哈夫曼树不符。a 的编码 000 长度为 3,不符。f 的编码 01 长度为 2,不符合最优树结构。因此正确答案为 A。
原题:
给定一棵二叉树,其前序遍历结果为:ABDECFG,中序遍历结果为:DEBACFG。请问这棵树的正确后序遍历结果是什么?( )
A.EDBGFCA
B.EDGBFCA
C.DEBGFCA
D.DBEGFCA
正确答案: A
深度解析:
本题考查 已知二叉树的前序遍历与中序遍历还原二叉树并求后序遍历。
建树分析:
A 为根节点。在中序 DEBACFG 中定位 A:DEBCFGDEB:BDE,可知左子树根节点为 B。DEB 中,B 的左侧为 DE,无右侧。D 后出现 E,可知 D 为 B 的左孩子;中序 DE 说明 E 为 D 的右孩子。CFG:CFG,可知右子树根节点为 C。CFG 中,C 无左侧,右侧为 FG。FG 表明 F 为 C 的右孩子,G 为 F 的右孩子。二叉树结构图解:
1
2
3
4
5
6
7
A
/ \
B C
/ \
D F
\ \
E G
求后序遍历(左 $\rightarrow$ 右 $\rightarrow$ 根):
E -> D -> BG -> F -> CA组合后序遍历结果为:EDBGFCA,对应 A 选项。
原题:
考虑一个有向无环图,该图包含 4 条有向边:$(1, 2)$, $(1, 3)$, $(2, 4)$ 和 $(3, 4)$。以下哪个选项是这个有向无环图的一个有效的拓扑排序?( )
A.4, 2, 3, 1
B.1, 2, 3, 4
C.1, 2, 4, 3
D.2, 1, 3, 4
正确答案: B
深度解析:
本题考查 有向无环图(DAG)的拓扑排序。
拓扑排序规则: 对于图中的任意一条有向边 $(u, v)$,在拓扑序列中顶点 $u$ 必须排在顶点 $v$ 之前。
根据题目给出的 4 条边:
1 必须排在 2 之前1 必须排在 3 之前2 必须排在 4 之前3 必须排在 4 之前检查各选项:
4, 2, 3, 1:顶点 4 排在 1 之前,违反约束。1, 2, 3, 4:1 在 2,3 之前,2,3 在 4 之前,完全满足要求!1, 2, 4, 3:4 排在 3 之前,违反了边 $(3, 4)$ 的要求。2, 1, 3, 4:2 排在 1 之前,违反了边 $(1, 2)$ 的要求。正确答案选 B。
原题:
在计算机中,以下哪个选项描述的数据存储容量最小( )
A. 字节 (byte)
B. 比特 (bit)
C. 字 (word)
D. 千字节 (kilobyte)
正确答案: B
深度解析:
本题考查 计算机存储单位基本概念:
0 或 1)。根据换算关系:$\text{bit} < \text{Byte} \le \text{Word} < \text{KB}$,因此比特(bit)最小。
原题:
一个班级有 10 个男生和 12 个女生。如果要选出一个 3 人的小组,并且小组中必须至少包含 1 个女生,那么有多少种可能的组合?( )
A. 1420
B. 1770
C. 1540
D. 2200
正确答案: A
深度解析:
本题考查 组合数学与计数问题。
全班总人数 $= 10 + 12 = 22$ 人。要求选出 3 人,且至少有 1 个女生。
方法一:反向剔除法(正难则反,推荐)
不加限制地从 22 人中任选 3 人的总组合数: \(C_{22}^3 = \frac{22 \times 21 \times 20}{3 \times 2 \times 1} = 1540\)
不符合要求的组合数(即选出的 3 人全为男生,没有女生): \(C_{10}^3 = \frac{10 \times 9 \times 8}{3 \times 2 \times 1} = 120\)
符合“至少包含 1 个女生”的组合数: \(\text{满足要求的组合数} = C_{22}^3 - C_{10}^3 = 1540 - 120 = 1420\)
方法二:分类讨论法
\[\text{总组合数} = 540 + 660 + 220 = 1420\]
两种方法计算结果一致,对应 A 选项。
原题:
以下哪个不是操作系统?( )
A. Linux
B. Windows
C. Android
D. HTML
正确答案: D
深度解析:
本题考查 计算机基础知识与系统软件常识:
正确答案选 D。
从 2023 年 CSP-J 第一轮单项选择题来看,考察重点非常清晰:
建议同学们在备考时加强动手草稿计算能力(进制转换与树/图的推演),理解算法原理而非机械背诵!
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP 学习专题站:GESP WIKI
"luogu-"系列题目可在洛谷题库进行在线评测。
"bcqm-"系列题目可在编程启蒙题库进行在线评测。
欢迎加入:Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答
欢迎加入:C++ GESP/CSP认证学习QQ频道,考试资源总结汇总
欢迎加入:C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。