试卷解析 · 理解每一步
2024-09-Level-7
2024-09-Level-7
试卷解析总览,可直接查看每题答案与解析。
第 1 题(单选题,2 分)
已知小写字母 b 的 ASCII 码为 98,下列 C++ 代码的输出结果是()。
#include <iostream>
using namespace std;
int main() {
char a = 'b';
a++;
cout << a;
return 0;
}正确答案B
解析详情
char 变量存的是字符编码,'b' 的 ASCII 码是 98,执行 a++ 后变成 99,对应字符就是 'c'。
cout 输出的是字符本身,因此结果为 c,不是 98 或 99。
第 2 题(单选题,2 分)
已知 a 为 int 类型变量,下列表表达式不符合语法的是()。
正确答案D
解析详情
a++ 是一个完整的后置自增表达式,后面不能直接再接 3 组成 a++3,所以该写法不合法。
A 是取地址后再做偏移,B 可按 (+a) & 3 解析,C 可按 a-- - 4 解析,语法上都能成立。
第 3 题(单选题,2 分)
下列关于C++语言中指针的叙述,不正确的是()。
正确答案C
解析详情
结构体成员完全可以是指向本结构体类型的指针,例如链表结点里的 Node* next,这正是常见写法。
A、B、D 都是指针的基本性质,只有 C 否定了这种自引用结构,因此错误。
第 4 题(单选题,2 分)
下列关于 C++ 类的说法,错误的是()。
正确答案C
解析详情
定义类对象时不一定调用默认构造函数,也可能调用有参构造函数或复制构造函数,所以 C 错。
按值传参会触发复制构造,派生类对象构造前会先构造基类部分,对象赋值也不是重新构造。
第 5 题(单选题,2 分)
某二叉树T的先序遍历序列为:{A B D C E G H F},中序遍历序列为:{D B A H G E C F},则下列说法中正确的是()。
正确答案A
解析详情
由先序和中序可还原出最长路径 A-C-E-G-H,共 5 层,所以树高为 5。
这棵树的叶子只有 D、H、F 共 3 个,而且右子树形成长链,不是平衡树,因此只有 A 正确。
第 6 题(单选题,2 分)
一棵完全二叉树有431个结点,则叶结点有多少个?()
正确答案C
解析详情
完全二叉树的叶结点数为 ceil(n/2),也可写成 floor((n+1)/2)。
当 n=431 时,叶结点数为 216,所以选 C。
第 7 题(单选题,2 分)
下列关于树的说法,错误的是()。
正确答案A
解析详情
深度优先遍历包含先序、中序、后序等多种方式,中序只是其中一种,不可能“总是相同”,所以 A 错。
一般树都能通过孩子兄弟表示法转成二叉树;祖先关系在同一路径上具有传递性;树中每个结点都至多有一个父结点。
第 8 题(单选题,2 分)
一个简单无向图有10个结点、30条边。再增加多少条边可以成为完全图。()
正确答案B
解析详情
10 个结点的完全无向图共有 10×9÷2=45 条边。
原图已有 30 条边,还需补 45-30=15 条边,所以选 B。
第 9 题(单选题,2 分)
以下哪个方案可以合理解决或缓解哈希表冲突()。
正确答案D
解析详情
发生冲突后继续寻找后面的空位,是开放定址法中的线性探测,能够保留原有元素并插入新元素。
直接丢弃或覆盖旧元素都会丢数据,机械地放到“下一个位置”如果仍冲突也不能解决问题。
第 10 题(单选题,2 分)
一个迷宫,已知从起点不经过重复结点到达终点的路径有且仅有一条,则下面说法错误的是()。
正确答案D
解析详情
从起点到终点只有一条不重复结点的路径,并不等于整个连通部分无环;环完全可能挂在主路径某个点上而不影响起终点间唯一路径。
DFS、BFS 都能找到这条路,而在同一连通块中的结点既然与起点连通,也一定能通过连通块到达终点。
第 11 题(单选题,2 分)
下面程序的输出为()。
#include <iostream>
#include <cmath>
using namespace std;
int main() {
cout << (int)log(8) << endl;
return 0;
}正确答案A
解析详情
cmath 中的 log 是自然对数,log(8) 约等于 2.079。
强制转换为 int 会截去小数部分,得到 2,因此输出 A。
第 12 题(单选题,2 分)
下面程序的输出为()。
#include <iostream>
#define N 10
using namespace std;
int path[N][N];
int main() {
for (int i = 1; i < N; i++)
path[i][0] = i;
for (int j = 1; j < N; j++)
path[0][j] = j;
for (int i = 1; i < N; i++)
for (int j = 1; j < N; j++)
path[i][j] = path[i - 1][j] + path[i][j - 1];
cout << path[8][4] << endl;
return 0;
}正确答案C
解析详情
数组是全局变量,初值为 0,再把第一行和第一列分别设成 1 到 9。
随后按 path[i][j]=path[i-1][j]+path[i][j-1] 递推,算到 path[8][4] 的结果是 1012,所以选 C。
第 13 题(单选题,2 分)
上题中程序的时间复杂度为()。
正确答案D
解析详情
初始化两条边界各是 O(N),核心部分是两层从 1 到 N-1 的嵌套循环,共执行约 N^2 次。
主导项来自双重循环,所以总时间复杂度是 O(N^2)。
第 14 题(单选题,2 分)
下面 fib 函数的时间复杂度为()。
int fib_rcd[MAX_N];
int fib(int n) {
if (n <= 1)
return 1;
if (fib_rcd[n] > 0)
return fib_rcd[n];
return fib(n - 1) + fib(n - 2);
}正确答案B
解析详情
代码只检查 fib_rcd[n],却没有把新算出的结果写回去,所以记忆化实际上没有生效。
递推仍近似满足 T(n)=T(n-1)+T(n-2),时间复杂度是指数级;在给定选项中应选更精确的 B,而不是 D。
第 15 题(单选题,2 分)
下列选项中,哪个可能是下图的广度优先遍历序列()。

正确答案A
解析详情
需结合图片确认。按图中有向边从 1 出发,第一层可以到 3、5;再由 3 扩展出 7、4、2,因此序列 1,3,5,7,4,2,6,8,9 可以作为某种邻接访问顺序下的 BFS 结果。
其余选项把更深层结点提前,或与图中的可达方向不符,所以不可能。
判断题
第 1 题(判断题,2 分)
表达式 'a' << 1 的结果为 'a'。
正确答案错误
解析详情
字符 'a' 的编码是 97,表达式 'a' << 1 会先按整数参与左移,得到 194,而不是字符 'a'。
左移运算改变的是二进制位,不会保持原字符不变。
第 2 题(判断题,2 分)
在 C++ 语言中,函数可以定义在另一个函数定义之内。
正确答案错误
解析详情
标准 C++ 不允许在一个函数体内部再定义另一个函数。
函数可以在类内定义成员函数,也可以声明后在外部实现,但不能写成嵌套函数定义。
第 3 题(判断题,2 分)
选择排序一般是不稳定的。
正确答案正确
解析详情
选择排序每一趟会把最小值直接交换到前面,这次交换可能让相等元素的相对次序发生改变。
因此它一般是不稳定排序。
第 4 题(判断题,2 分)
埃氏筛法和欧拉筛法都是使用筛法思想生成素数表的算法,欧拉筛法的时间复杂度更低。
正确答案正确
解析详情
埃氏筛法的复杂度通常记为 O(n log log n),欧拉筛法能做到线性筛,即 O(n)。
两者都用“筛去合数”的思想,但欧拉筛在复杂度上更低。
第 5 题(判断题,2 分)
使用 math.h 或 cmath 头文件中的正弦函数,表达式的结果类型为 double、值约为 0.5。
正确答案错误
解析详情
sin 函数的返回类型确实是 double,但 sin(3θ) 的数值取决于 θ,不给出 θ 就不能确定约为 0.5。
命题把“类型正确”和“具体值固定”绑在一起,因此整体是错的。
第 6 题(判断题,2 分)
一颗N层的完全二叉树,一定有个结点。
正确答案错误
解析详情
N 层满二叉树才一定有 2^N-1 个结点;完全二叉树只要求除最后一层外全满,最后一层可以不满。
所以 N 层完全二叉树的结点数不一定恰好等于 2^N-1。
第 7 题(判断题,2 分)
一个图,不管是否连通,都可以使用深度优先搜索算法进行遍历。
正确答案正确
解析详情
图不连通时,从某个起点做一次 DFS 只能遍历一个连通块。
如果把“遍历整个图”理解为对每个未访问结点再补一次 DFS,那么无论图是否连通都可以完成遍历。
第 8 题(判断题,2 分)
某个哈希表键值 x 为整数,是常用的哈希函数之一,要求 p 选择素数是因为这样不会产生冲突。()
正确答案错误
解析详情
选素数 p 是为了让取模分布更均匀、减少某些规律数据带来的聚集,但并不能保证完全没有冲突。
只要两个不同整数相差 p 的倍数,取模后仍可能落到同一个槽位。
第 9 题(判断题,2 分)
使用单链表实现队列时,链表头结点作为队首比链表头结点作为队尾更便于操作。
正确答案正确
解析详情
单链表只能方便地从头结点往后走,因此把头结点作为队首时,出队可直接删除表头,操作更简单。
若把头结点当队尾,想在队首出队就需要找到前驱,效率和实现都会变差。
第 10 题(判断题,2 分)
一个图中,每个结点表达一个人,连接两个结点的边表达两个结点对应的人相互认识,则这个图可以用来表达社交网络。
正确答案正确
解析详情
把人看作结点、把“互相认识”看作边,正是社交网络最常见的图模型之一。
后续还可以在这个图上分析好友关系、连通分量和传播路径等问题。