试卷解析 · 理解每一步
2025-03-Level-8
2025-03-Level-8
试卷解析总览,可直接查看每题答案与解析。
第 1 题(单选题,2 分)
国家“以旧换新”政策仍在继续,小杨家决定在家里旧的冰箱、电视、洗衣机、微波炉中选两种换新。其中,冰箱有4种型号可选,电视有6种型号可选,洗衣机有3种型号可选,微波炉有5种型号可选。请问小杨家共有多少种换新的方案?()。
正确答案B
解析详情
先选哪两种电器,再选各自型号。六类组合分别为冰箱电视、冰箱洗衣机、冰箱微波炉、电视洗衣机、电视微波炉、洗衣机微波炉。
对应方案数为 4×6、4×3、4×5、6×3、6×5、3×5,相加为 ,选 B。
第 2 题(单选题,2 分)
小杨和3位朋友约好一起去看电影“哪吒2”。打开购票软件,他们发现,已经没有同一排连续的四个座位了(图中每个方框代表一个座位,红色方框代表已经售出)。朋友们商量了一下,决定分为两组,每组两人在同一排的相邻两个座位,且两组之间至少有一对座位是前后相邻的。请问共有多少种购票方案?()。

正确答案C
解析详情
把图中三行从上到下编号,每行从左到右为 1 到 6 列。空闲相邻座位对:第一行有 (1,2)、(5,6);第二行有 (1,2)、(2,3)、(5,6);第三行有 (1,2)、(2,3)。
上下两组至少有一对前后相邻,等价于它们所在行相邻且列区间有重合。第一、二行之间有 3 种搭配,第二、三行之间有 4 种。
因此购票方案共 ,选 C;这里只数买哪四个座位,不数四人如何分配座位。
左右滑动表格,可查看完整内容。
| 方案 | 上方相邻两座 | 下方相邻两座 |
|---|---|---|
| 1 | 第1行:1、2列 | 第2行:1、2列 |
| 2 | 第1行:1、2列 | 第2行:2、3列 |
| 3 | 第1行:5、6列 | 第2行:5、6列 |
| 4 | 第2行:1、2列 | 第3行:1、2列 |
| 5 | 第2行:1、2列 | 第3行:2、3列 |
| 6 | 第2行:2、3列 | 第3行:1、2列 |
| 7 | 第2行:2、3列 | 第3行:2、3列 |
行从上到下、列从左到右编号;每行是一组四座方案,不区分人员落座顺序。
第 3 题(单选题,2 分)
下面关于C++类构造和析构函数的说法,错误的是()。
正确答案B
解析详情
析构函数可以是普通函数,并非必须声明为 virtual。只有需要通过基类指针安全地多态删除派生类对象等情形时,虚析构函数才特别关键,因此 B 错误。
构造函数不能为 virtual;构造函数和析构函数可以设为 private,用于限制外部创建或销毁对象。
第 4 题(单选题,2 分)
下列关于树和图的说法,错误的是()。
正确答案A
解析详情
有向无环图只要求没有有向环,不保证满足树的连通性或每个非根结点只有一个父结点。
例如边 1→2、1→3、2→3 构成有向无环图,但结点 3 有两个前驱,忽略方向还形成三角形,不是一棵树。
所以 A 把所有有向无环图都当成树,错误。
第 5 题(单选题,2 分)
从 1 到 2025 这 2025 个数中,包含数字 5 的个数()。
正确答案D
解析详情
按当前答案 603 来看,这题应按“数字 5 出现的总次数”理解。1 到 2025 中,个位出现 5 的次数是 203 次,十位是 200 次,百位是 200 次,千位没有出现。
所以总次数为 203+200+200=603,对应 D。
第 6 题(单选题,2 分)
已定义 double 类型的变量 r 和 theta,分别表示图中圆半径和圆心角。下列表达式中可以求出弦长 s 的是()。

正确答案D
解析详情
连接圆心与弦的两个端点,得到两腰均为 r、顶角为 θ 的等腰三角形。
从圆心向弦作垂线,弦被平分,圆心角也分为 θ/2。在任一半个直角三角形中,半弦长为 。
所以 ,选 D;调用 sin 时 θ 应使用弧度。
第 7 题(单选题,2 分)
N个节点的平衡二叉树的高为()。
正确答案D
解析详情
平衡二叉树要求各处子树高度差受到限制,却不要求各层都填满。相同结点数可以组成不同形状的平衡树。
例如按层数计高度,7 个结点可构成高度 3 的满二叉树,也可构成高度 4 的 AVL 平衡树。因此仅凭 N 无法唯一确定精确树高,选 D。
可确定的是高度数量级通常为 。
第 8 题(单选题,2 分)
下列关于算法的说法,错误的是()。
正确答案B
解析详情
分治先拆分问题,再求子问题并合并结果。“子问题相互独立”是许多典型分治算法的便利特征,但不是所有分治过程都必须完全无关联或无重叠。
例如直接递归计算斐波那契数会产生重叠子问题,仍具有分解和合并过程,只是效率低,可再用记忆化改进。因此 B 的“必须”过强。
第 9 题(单选题,2 分)
2025是个神奇的数字,因为它是由两个数20和25拼接而成,而且2025=。小杨决定写个程序找找小于N的正整数中共有多少这样神奇的数字。下面程序横线处应填入的是()。
int cnt = 0;
for (int n = 1; n * n < N; n++) {
int n2 = n * n;
std::string s = std::to_string(n2);
for (int i = 1; i < s.length(); i++)
if (s[i] != '0') {
std::string sl = s.substr(0, i);
std::string sr = s.substr(i);
int nl = std::stoi(sl);
int nr = std::stoi(sr);
if (____) // 在此处填入选项
cnt++;
}
}
}
return cnt;
}正确答案A
解析详情
已知 n2=n*n,再把 n2 的十进制拆成左半 nl 和右半 nr。题目中的“神奇数字”要求 n2 是由 nl、nr 拼接而成,且满足 n=(nl+nr)。
所以横线处只需要判断 nl + nr == n,选 A。B 把和错比成平方数,C 多做了一次平方,D 中 ^ 还是按位异或。
第 10 题(单选题,2 分)
2025 是个神奇的数字,因为它是由两个数 20 和 25 拼接而成,而且。小杨决定写个程序找找小于 N 的正整数中共有多少这样神奇的数字。该函数的时间复杂度为()。
#include <string>
int count_miracle(int N) {
int cnt = 0;
for (int n = 1; n * n < N; n++) {
int n2 = n * n;
std::string s = std::to_string(n2);
for (int i = 1; i < s.length(); i++) {
if (s[i] != '0') {
std::string sl = s.substr(0, i);
std::string sr = s.substr(i);
int nl = std::stoi(sl);
int nr = std::stoi(sr);
if (____) // 在此处填入选项
cnt++;
}
}
return cnt;
}
}正确答案D
解析详情
外层循环满足 n*n<N,因此 n 的取值规模约为 O(N^1/2)。内层按 s 的位数枚举切分点,长度为 O(log N)。
每次切分会做 substr 和 stoi,单次也需要 O(log N),因此总复杂度是 O(N^1/2·(log N)^2),选 D。
第 11 题(单选题,2 分)
下面的欧氏筛法程序中,两个横线处应填入的分别是()。
int primes[MAXP], num = 0;
bool isPrime[MAXN + 1] = {false};
void sieve() {
for (int n = 2; n <= MAXN; n++) {
if (!isPrime[n])
primes[num++] = n;
for (int i = 0; i < num && _____; i++) { // 在此处填入选项
isPrime[n * primes[i]] = true;
if (____) // 在此处填入选项
break;
}
}
}正确答案C
解析详情
数组 isPrime 的大小是 MAXN+1,合法下标包括 MAXN,因此乘积的范围条件应为 n*primes[i]<=MAXN。
当 n%primes[i]==0 时应停止:继续使用更大质数,会让某些合数被重复筛去;在这里中断保证每个合数由其最小质因子负责标记。
两个条件对应 C。
第 12 题(单选题,2 分)
下面Floyd算法中,横线处应该填入的是()。
#include <iostream>
using namespace std;
#define N 21
#define INF 99999999
int map[N][N];
int main() {
int n, m, t1, t2, t3;
cin >> n >> m;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j)
map[i][j] = 0;
else
map[i][j] = INF;
}
}
for (int i = 1; i <= m; i++) {
cin >> t1 >> t2 >> t3;
map[t1][t2] = t3;
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (map[i][j] > map[i][k] + map[k][j])
_______; // 在此处填入选项
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cout.width(4);
cout << map[i][j];
}
cout << end1;
}
}
}
}正确答案A
解析详情
Floyd 的核心转移是:若经过中转点 k 更短,就用 map[i][k]+map[k][j] 更新 map[i][j]。
因此横线处应填 map[i][j] = map[i][k] + map[k][j],选 A。题中代码排版虽有噪声,但转移式是标准的。
第 13 题(单选题,2 分)
下面Floyd算法程序的时间复杂度为()。
#include <iostream>
using namespace std;
#define N 21
#define INF 99999999
int map[N][N];
int main() {
int n, m, t1, t2, t3;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
10
if (i == j)
map[i][j] = 0;
else
map[i][j] = INF;
}
for (int i = 1; i <= m; i++) {
cin >> t1 >> t2 >> t3;
map[t1][t2] = t3;
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (map[i][j] > map[i][k] + map[k][j])
; // 在此处填入选项
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cout.width(4);
cout << map[i][j];
}
cout << endl;
}正确答案C
解析详情
Floyd 算法的主体是三重循环 k、i、j,各自都遍历 1 到 N。
因此主导复杂度为 O(N^3),选 C;题中其余输出和排版噪声不改变这一结论。
第 14 题(单选题,2 分)
下列程序实现了输出杨辉三角形,代码中横线部分应该填入的是()。
#include <iostream>
using namespace std;
#define N 35
int a[N];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
a[i] = 1;
for (int j = i - 1; j > 0; j--) {
// 在此处填入选项
for (int j = 0; j <= i; j++) {
cout << a[j] << "";
cout << endl;
}
return 0;
}
}
}正确答案B
解析详情
一维数组滚动生成杨辉三角时,要从右往左更新,这样 a[j-1] 还保留着上一行的值。
因此递推应写成 a[j] += a[j - 1],对应 B。若从左往右或改错下标,会把本行新值重复利用。
第 15 题(单选题,2 分)
下列程序实现了输出杨辉三角形,其时间复杂度为()。
#include <iostream>
using namespace std;
#define N 35
int a[N];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
a[i] = 1;
for (int j = i - 1; j > 0; j--)
___ // 在此处填入选项
for (int j = 0; j <= i; j++)
cout << a[j] << " "
cout << endl;
}
return 0;
}正确答案C
解析详情
第 i 行先做一次长度约为 i 的倒序更新,再输出 i+1 个数,所以这一行的工作量是 O(i)。
把 i=0 到 n-1 累加,总代价为 1+2+...+n=O(n^2),因此选 C。
判断题
第 1 题(判断题,2 分)
表达式 '5' - 3.0 的结果为 2.0,类型为 double。
正确答案错误
解析详情
字符 '5' 参与计算时使用编码值,在 ASCII 下为 53。与 double 数值 3.0 运算时,53 转为 double,再相减得到 50.0。
结果类型是 double,但数值不是 2.0,所以判断错误。若要取得数字 5,应先做 '5'−'0'。
第 2 题(判断题,2 分)
在C++语言中,如果想要在一个函数内调用一个类的私有方法,可以在该类中将该函数声明为友元函数。
正确答案正确
解析详情
私有成员通常只能由类自身成员等授权范围访问。类中声明一个普通函数为 friend 后,该函数便获得访问该类私有和受保护成员的权限。
因此可以通过友元声明,让类外函数调用该类私有方法,题目正确。
第 3 题(判断题,2 分)
插入排序一般是稳定的。
正确答案正确
解析详情
标准插入排序移动的是严格大于当前关键字的已有元素,遇到相等元素就停止移动,将新元素放在旧相等元素之后。
例如 2a 先出现、2b 后出现,排序后仍是 2a 在前,所以一般稳定。
第 4 题(判断题,2 分)
5 个相同的红球和 4 个相同的蓝球排成一排,要求蓝球不能相邻,则一共有 15 种排列方案。
正确答案正确
解析详情
先放好 5 个相同红球,形成首尾及内部共 6 个空隙。要让蓝球互不相邻,每个空隙最多放 1 个蓝球。
从 6 个空隙选 4 个放入相同蓝球,有 种,因此正确。
第 5 题(判断题,2 分)
使用 math.h 或 cmath 头文件中的函数,表达式 pow(2, 5) 的结果类型为 int、值为 32。
正确答案错误
解析详情
pow(2,5) 计算 ,数值部分正确。
但 cmath 的此类算术参数调用采用浮点计算,返回通常为 double,而不是因为实参都是整数就返回 int,所以整个判断错误。
第 6 题(判断题,2 分)
C++ 是一种面向对象编程语言,C 则不是。多态是面向对象三大特性之一,虚函数是动态多态的代表特性。因此,使用 C 语言无法实现虚函数。
正确答案错误
解析详情
C 语言没有 C++ 的 virtual 关键字和成员函数语法,但可在结构体中存储函数指针,并通过对象中的函数指针调用不同实现。
这可以模拟虚函数表及运行时分派,因此不能从“不是面向对象语言”推出“无法实现虚函数机制”。
第 7 题(判断题,2 分)
在 N 个节点的平衡二叉树中查找指定元素的最差时间复杂度为。
正确答案错误
解析详情
按题目默认的平衡二叉搜索树语境,树高为 ,查找每层只沿一个孩子继续,故最坏比较次数也是对数级。
题目给出的 O(N) 不是所求的紧确复杂度,按考试口径判错误。若只是一棵无搜索次序的平衡二叉树,则另需遍历,不能混淆这两个前提。
第 8 题(判断题,2 分)
定义 int 类型的变量 a 和 b,求二次函数取最小值时 x 的值,可以通过表达式求得。
正确答案正确
解析详情
配方得到 。平方项在 x=−a/2 时最小为 0,因此顶点横坐标就是 −a/2。
使用 2.0 可让除法按浮点数计算,a 为奇数时也保留半整数结果,所以题中表达式符合公式。
第 9 题(判断题,2 分)
判断无向图中是否有环,可以通过广度优先搜索实现。
正确答案正确
解析详情
BFS 记录每个结点的父结点。扫描边 u—v 时,若 v 未访问则将其入队;若 v 已访问且不是 u 的父结点,就发现了一条非树边,说明存在环。
对每个未访问连通分量都执行这一检查,即可判断整个无向简单图是否有环。
第 10 题(判断题,2 分)
从 32 名学生中选出 4 人分别担任班长、副班长、学习委员和组织委员,共有种不同的选法。
正确答案错误
解析详情
先选班长有 32 种,再选副班长 31 种、学习委员 30 种、组织委员 29 种。
总数为 。组合数 C(32,4) 只选出四个人,没有分配四个不同职务,因此错误。