GESP认证C++编程真题解析 | 202512 七级
附上汇总帖:GESP认证C++编程真题解析 | 汇总
单选题
第1题
下面关于C++中形参、实参和定义域的说法中,正确的一项是( )。
A. 形参是函数定义时所指定的变量,它只在函数内部有效。
B. 在函数内部,可以修改传入的形参的值,即使该形参是一个常量引用。
C. 实参和形参的类型必须完全一致,否则会导致编译错误。
D. 使用指针作为形参时,形参是指向实参的地址,因此对该指针赋值会影响实参。
【答案】:A
【解析】
如果函数的形参是常量引用,不能在函数内部修改,B错误。
调用函数时,传入函数的实参如果和形参的类型不一致,则首先会尝试将参数做隐式类型转换,如ceil(2),会将2隐式转换为2.0。可见,实参和形参类型不一致时,不一定会导致编译错误,C错误。
在函数中改变形参的地址值,不影响实参的地址值,但改变形参的地址所指向的变量值,则是可以在函数外也生效的。D错误。
第2题
已知三个序列: s1 = {3, 1, 8, 2, 5, 6, 7, 4} ,s2 = {1, 5, 1, 8, 6, 4, 7, 5, 6} ,s3 = {1, 8, 3, 5, 7, 6, 2, 4}。以下哪个序列是它们的最长公共子序列( )。
A. {1, 8, 5, 6}
B. {1, 5, 6, 7}
C. {1, 8, 6}
D. {1, 5, 7, 4}
【答案】:A
【解析】
通过比对可以发现,A、C选项是s1、s2、s3的公共子序列,且A选项的子序列更少,选A。
第3题
现有一个地址区间为 \(0\sim 10\) 的哈希表,当出现冲突情况,会往后找第一个空的地址存储(到 \(10\) 冲突了就从 \(0\) 开始往后),现在要依次存储 \((1,3,5,7,9)\),哈希函数为 \(h(x)=(x^2+x)\ mod\ 11\)。其中 \(9\) 存储在哈希表哪个地址中( )。
A. \(1\)
B. \(2\)
C. \(3\)
D. \(4\)
【答案】:D
【解析】
存储1时,h(1)=2,存入位置2中。
存储3时,h(3)=1,存入位置1中。
存储5时,h(5)=8,存入位置8中。
存入7时,h(7)=1,位置1有元素,向后找到位置3为空,存入位置3中。
存入9时,h(9)=2,位置2、3都有元素,存入位置4中。
第4题
在0/1背包问题中,给定一组物品,每个物品有一个重量和价值,背包的容量有限。假设背包的最大容量为 \(W\),物品的数量为 \(n\),其中第 \(i\) 个物品的重量为 \(w[i]\),价值为 \(v[i]\)。以下关于0/1背包问题的描述,正确的是( )。
A. 在解决0/1背包问题时,使用贪心算法可以保证找到最优解,因为物品只能放入一次。
B. 0/1背包是P问题(多项式时间可解问题),它可以在 \(O(nW)\) 的时间复杂度内解决。
C. 0/1背包问题中,动态规划解法的空间复杂度为 \(O(nW)\),但可以通过滚动数组技巧将空间复杂度优化到 \(O(W)\)。
D. 0/1背包问题中,每个物品只能选择一次,并且子问题之间是独立的,无法重用计算结果。
【答案】:C
【解析】
0/1背包属于动态规划问题,使用贪心算法不一定得到最优解,A错误。
0/1背包看似是多项式时间的解法,但并不是P问题,而是NP问题,B错误。
0/1背包问题的解决中,存在重复子问题,因而可以利用动态规划的解法,重用其计算结果,D错误。
第5题
一棵深度为6(根节点深度为1)的完全二叉树,节点总数最少有( )。
A. 31
B. 32
C. 63
D. 64
【答案】:B
【解析】
尽可能少,则应在5层满二叉树的基础上,第6层仅添加一个叶节点,\(2^5-1+1=32\),选B。
第6题
对于如下二叉树,下面关于访问的顺序说法错误的是( )。

A. D E B F H J I G C A 是它的后序遍历序列。
B. A B C D E F G H I J 是它的广度优先遍历序列。
C. A B D E C F G H I J 是它的先序遍历序列。
D. D B E A F C H G J I 是它的中序遍历序列。
【答案】:D
【解析】
先序遍历:A B D E C F g H I J
中序遍历:D B E A F C H G I J
后序遍历:D E B F H J I G C A
广度优先遍历:A B C D E F G H I J
D正确。
第7题
下面程序的运行结果为( )。
#include <iostream>
int query(int n, int *a, int x) {
int l = 0, r = n;
while (l < r) {
int mid = l + (r - l) / 2;
if (a[mid] >= x) r = mid;
else l = mid + 1;
}
if (l == n) return -1;
return l;
}
int main() {
int n = 10;
int x = 3;
int num[] = {1, 2, 2, 3, 3, 4, 5, 5, 6, 7};
std::cout << query(n, num, x) << "\n";
return 0;
}
A. 2
B. 3
C. 4
D. 5
【答案】:B
【解析】
query函数实现了二分查找过程,目标是为了找到大于等于x的最小位置(即第一个大于等于3的位置,即3),选B。
第8题
下面程序中,函数 query 的时间复杂度是( )。
#include <iostream>
int query(int n, int *a, int x) {
int l = 0, r = n;
while (l < r) {
int mid = l + (r - l) / 2;
if (a[mid] >= x) r = mid;
else l = mid + 1;
}
if (l == n) return -1;
return l;
}
int main() {
int n = 10;
int x = 3;
int num[] = {1, 2, 2, 3, 3, 4, 5, 5, 6, 7};
std::cout << query(n, num, x) << "\n";
return 0;
}
A. \(O(1)\)
B. \(O(logn)\)
C. \(O(n)\)
D. \(O(nlogn)\)
【答案】:B
【解析】
二分查找的时间复杂度为 \(O(logn)\),选B。
第9题
有5个字符,它们出现的次数分别为2次、2次、3次、3次、5次。现在要用哈夫曼编码的方式来为这些字符进行编码,最小加权路径长度WPL(每个字符的出现次数 它的编码长度,再把每个字符结果加起来)的值为( )。
A. 30
B. 34
C. 43
D. 47
【答案】:B
【解析】
假设5个字符是a,b,c,d,e,构成的哈夫曼树如下:

计算是WPL为 2 * 3 + 2 * 3 + 3 * 2 + 3 * 2 + 5 * 2 = 34,选B。
第10题
下面程序的运行结果为( )。
#include <iostream>
using namespace std;
int f(int n) {
if (n <= 2) return n * 2;
return f(n - 1) + f(n - 2);
}
int main() {
cout << f(5) << endl;
return 0;
}
A. 10
B. 16
C. 26
D. 30
【答案】:B
【解析】
f(1)=2, f(2)=4, f(3)=6, f(4)=10, f(5)=16,选B。
第11题
一个简单无向图 \(G\) 有36条边,且每个顶点的度数都为4,则图 \(G\) 的顶点个数为( )。
A. 9
B. 12
C. 18
D. 36
【答案】:C
【解析】
无向图中,每增加一条边,就有两个点的度数分别加1。因此,无向图中结点的度数之和=边数的2倍。解得n=18,选C。
第12题
下面关于二叉树的说法正确的是( )。
A. 任意二叉树的中序遍历与后序遍历必定不相同。
B. 对任意二叉树,若已知先序遍历与后序遍历,则该二叉树唯一确定。
C. 若二叉树有 \(n\) 个结点,根节点高度为 \(1\),则其高度满足: \(\lceil log_2(n+1)\rceil\le h\le n\)。
D. 在二叉树的先序遍历中,根后紧跟的结点一定是根的左孩子。
【答案】:C
【解析】
如果只有一个根节点时,其所有遍历都是相同的,A错误。
已知先序和后序,是无法确定的,B错误。
n个结点的二叉树,其为完全二叉树时,高度最小,即为 \(\lceil log_2(n+1)\rceil\),其为联时,高度最大,即为n。C正确。
左儿子不存在时,遍历的是根的右儿子,D错误。
第13题
假设一个算法时间复杂度的递推式是 \(T(n)=8T(\frac{n}{4})+n\sqrt n\)(\(n\) 为正整数),和 \(T(0)=1\),那么这个算法的时间复杂度是( )。
A. \(O(n\sqrt n)\)
B. \(O(n\sqrt nlogn)\)
C. \(O(n^2)\)
D. \(O(n^2logn)\)
【答案】:B
【解析】
第一层中,本身需要 \(n\sqrt n\) 的时间,第二层中,本身需要时间为 \(\frac{n}{4}\sqrt \frac{n}{4}\) ,共8次调用,则为 \(8\times \frac{n}{4}\times \frac{\sqrt n}{2}=n\sqrt n\)。
递归层数是 \(O(logn)\),所以答案选B。
第14题
下面哪一个可能是下图的深度优先遍历序列( )。

A. 1, 5, 6, 3, 2, 8, 9, 4, 7
B. 1, 5, 8, 9, 7, 4, 6, 3, 2
C. 3, 2, 1, 4, 7, 6, 9, 5, 8
D. 2, 5, 6, 3, 8, 7, 9, 4, 1
【答案】:B
【解析】
从1、3、2结点按图遍历后,只有B正确。
第15题
下面这个有向图的强连通分量的个数是( )。

A. 3
B. 4
C. 5
D. 6
【答案】:C
【解析】
通过反复缩圈,将一个有向环视作一个“大点”,简化全图。最后划分为:{1, 2}, {4, 5, 7, 8}, {6, 9, 10, 11}, {3} 和 {12},选C。
判断题
第1题
C++语言中,表达式 3 ^ 2 的结果类型为 int ,值为 9。
A. 正确
B. 错误
【答案】:B
【解析】
^ 表示异或运算,结果为1,不能理解为幂运算。
第2题
使用 cmath 头文件中的正弦函数,表达式 sin(90) 的结果类型为 double ,值约为 1.0。
A. 正确
B. 错误
【答案】:B
【解析】
函数sin(x)的作用是:对弧度制的角x,求对应的数学函数的值。实参应为 90° 的弧度制,约为 \(\frac{\pi}{2}\),而不能直接传入角度制的参数。
第3题
使用 strcmp("10", "9") 比较两个字符串,返回值大于0,说明 "10" 比 "9" 大。
A. 正确
B. 错误
【答案】:B
【解析】
strcmp是比较字符串的字典序,“10”的字典序小于“9”。
第4题
选择排序是一种不稳定的排序算法,而冒泡排序是一种稳定的排序算法。
A. 正确
B. 错误
【答案】:A
【解析】
选择排序,如果序列元素全部相同,选择排序过程会导致相同元素的顺序发生改变。冒泡排序每次检查相邻两个元素,只有满足给定的排序条件,才将相邻两个元素交换,因此相同元素一定不会交换至另一个元素的后方。因此,冒泡排序是稳定的。
第5题
求两个长度为 \(n\) 序列的最长公共子序列(LCS)长度时,可以使用滚动数组将空间复杂度从 \(O(n^2)\) 优化到 \(O(n)\)。
A. 正确
B. 错误
【答案】:A
【解析】
记f[i][j]表示s[1-i]和t[1-j]的LCS,其只与前一行的f[i-1][j],f[i-1][j-1],以及本行的左侧f[i][j-1]有关,因此可使用滚动数组f[2][N],状态转移时,只需第一维除以2的余数,即f[i%2][j]。
第6题
在无向图中,所有顶点的度数之和等于边数的两倍。
A. 正确
B. 错误
【答案】:A
【解析】
在无向图中,每增加一条边,就有两个点的度数分别加1。因此,无向图中结点的度数之和 = 边数的2倍。
第7题
使用邻接矩阵存储一个有 \(V\) 个顶点、\(E\) 条边的图,对该图进行一次完整的BFS遍历,时间复杂度为 \(O(V+E)\)。
A. 正确
B. 错误
【答案】:B
【解析】
如果使用邻接矩阵存储图,每遍历到一个点时,枚举其出边的时间复杂度不是其出边的数量,而是固定的 \(O(V)\),则对所有点枚举出现的总时间复杂度就会达到 \(O(V^2)\)。
第8题
在图像处理或游戏开发中,泛洪(flood fill)算法既可以用BFS实现,也可以用DFS实现。
A. 正确
B. 错误
【答案】:A
【解析】
泛洪算法只是一种处理思路,实现上既可以使用DFS,又可以使用BFS。
第9题
使用链地址法处理冲突的哈希表,当所有元素都映射到同一个槽位时,查找操作的最坏时间复杂度为 \(O(n)\),其中 \(n\) 为元素个数。
A. 正确
B. 错误
【答案】:A
【解析】
当所有的n个元素都映射到同一个槽位时,该槽位的链表恰有n个元素,最坏情况下,时间复杂度为 \(O(n)\)。
第10题
一个包含 \(V\) 个顶点的连通无向图,其任何一棵生成树都恰好包含 \(V-1\) 条边。
A. 正确
B. 错误
【答案】:A
【解析】
生成树也是树,V 个点的树一定有恰好 V-1 条边。
浙公网安备 33010602011771号