GESP 2025年3月_C++七级试卷

从PDF导入:GESP 2025年3月_C++七级试卷

C++ 180分钟 总分 100.0 27 题
试卷题目预览
第1题 中级 2.0分 单选
下列哪个选项是C++中的关键字?
A. function
B. class
C. method
D. object
第2题 中级 2.0分 单选
下面代码输出的是( )

int main() {
int a = 5, b = 2;
cout << (a >> b) << endl;
}

A. 1
B. 2
C. 5
D. 10
第3题 中级 2.0分 单选
以下代码的输出是什么?

int main() {
int a = 10;
int *p = &a;
int *&q = p;
*q = 20;
cout << a << endl;
return 0;
}

A. 10
B. 20
C. 0
D. 编译错误
第4题 中级 2.0分 单选
下面代码输出的是( )

int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr + 2;
cout << *p << endl;
return 0;
}

A. 1
B. 2
C. 3
D. 4
第5题 中级 2.0分 单选
下列关于排序的说法,正确的是( )。
A. 选择排序是最快的排序算法之一。
B. 归并排序通常是稳定的。
C. 最差情况,N个元素做快速排序的时间复杂度为O(N)。
D. 最好情况,N个元素做插入排序的时间复杂度为O(N²)。
第6题 中级 2.0分 单选
下面关于C++类构造和析构函数的说法,错误的是( )。
A. 构造函数不能声明为虚函数。
B. 析构函数必须声明为虚函数。
C. 类的默认构造函数可以被声明为private。
D. 类的析构函数可以被声明为private。
第7题 中级 2.0分 单选
下列关于树和图的说法,错误的是( )。
A. 树是一种有向无环图,但有向无环图不都是一棵树。
B. 如果把树看做有向图,每个节点指向其子节点,则该图是强连通图。
C. N个顶点且连通的无向图,其最小生成树一定包含N-1条边。
D. N+1个顶点、N条边的有向图,一定不是强连通的。
第8题 中级 2.0分 单选
2025是个神奇的数字,因为它是由两个数20和25拼接而成,而且2025=(20+25)²。小杨决定写个程序找找小于N的正整数中共有多少这样神奇的数字。下面程序

#include
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;
}

A. nl+nr==n
B. nl*nr==n
C. nl-nr==n
D. nl/nr==n
第9题 中级 2.0分 单选
给定一个无向图,图的节点编号从0到n-1,图的边以邻接表的形式给出。下面的程序使用深度优先搜索(DFS)遍历该图,并输出遍历的节点顺序。横线处应该填入的是(

#include
#include
#include
using namespace std;
void DFS(int start, vector>& graph, vector& visited) {
stack s;
s.push(start);
visited[start] = true;
while (!s.empty()) {
int node = s.top();
s.pop();
cout << node << " ";
for (int neighbor : graph[node]) {
if (!visited[neighbor]) {
_________________
_________________
}
}
}
}

A. visited[neighbor]=true; s.push(neighbor-1);
B. visited[neighbor]=true; s.push(neighbor+1);
C. visited[neighbor]=false; s.push(neighbor);
D. visited[neighbor]=true; s.push(neighbor);
第10题 中级 2.0分 单选
给定一个整数数组nums,找到其中最长的严格上升子序列的长度。下面的程序横线处应该填入的是( )

#include
#include
#include
using namespace std;
int lengthOfLIS(vector& nums) {
int n = nums.size();
if (n == 0) return 0;
vector dp(n, 1);
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
_________________
}
}
}
return *max_element(dp.begin(), dp.end());
}

A. dp[i] = max(dp[i], dp[j]);
B. dp[i] = max(dp[i+1], dp[j]+1);
C. dp[i] = max(dp[i], dp[j]-1);
D. dp[i] = max(dp[i], dp[j]+1);
第11题 中级 2.0分 单选
给定一个整数数组nums,找到其中最长的严格上升子序列的长度。该程序的时间复杂度为( )
A. O(n²)
B. O(n)
C. O(logn)
D. O(nlogn)
第12题 中级 2.0分 单选
给定两个无向图G1和G2,判断它们是否同构。图的同构是指两个图的节点可以通过某种重新编号的方式完全匹配,且边的连接关系一致。下面程序中横线处应该给出的是( )

#include
#include
#include
#include
using namespace std;
string graphHash(vector>& graph) {
vector nodeHashes(graph.size());
for (int i = 0; i < graph.size(); i++) {
vector neighbors = graph[i];
sort(neighbors.begin(), neighbors.end());
string hash;
for (int neighbor : neighbors) {
_________________
}
nodeHashes[i] = hash;
}
sort(nodeHashes.begin(), nodeHashes.end());
string finalHash;
for (string h : nodeHashes) finalHash += h + ";";
return finalHash;
}

A. hash += to_string(neighbor);
B. hash += to_string(neighbors);
C. hash += to_string(neighbor) + ",";
D. hash -= to_string(neighbors);
第13题 中级 2.0分 单选
给定一个m×n的二维网格grid,每个格子中有一个非负整数。请找出一条从左上角(0,0)到右下角(m-1,n-1)的路径,使得路径上的数字总和最小。横线处应该填

dp[0][0] = grid[0][0];
for (int j = 1; j < n; j++) dp[0][j] = dp[0][j-1] + grid[0][j];
for (int i = 1; i < m; i++) dp[i][0] = dp[i-1][0] + grid[i][0];
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
_________________
}
}
return dp[m-1][n-1];

A. dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][1];
B. dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
C. dp[i][j] = min(dp[i-1][j], dp[i][j]) + grid[i][j];
D. dp[i][j] = min(dp[i][j], dp[i][j-1]) + grid[i][j];
第14题 中级 2.0分 单选
给定一个整数数组nums,找到一个具有最大和的连续子数组,返回其最大和。下面横线处应该填入的是( )

int maxSubArray(vector& nums) {
int n = nums.size();
if (n == 0) return 0;
vector dp(n, 0);
dp[0] = nums[0];
int maxSum = dp[0];
for (int i = 1; i < n; i++) {
_________________
maxSum = max(maxSum, dp[i]);
}
return maxSum;
}

A. dp[i] = max(nums[i+1], dp[i-1]+nums[i]);
B. dp[i] = max(nums[i], dp[i-1]+nums[i]);
C. dp[i] = max(nums[i], dp[i+1]+nums[i]);
D. dp[i] = max(nums[i], dp[i-1]+nums[i+1]);
第15题 中级 2.0分 单选
在哈希表的实现中,冲突解决是一个重要的问题。以下哪种方法不是常见的哈希表冲突解决策略?
A. 链地址法(Chaining)
B. 开放地址法(Open Addressing)
C. 二次哈希法(Double Hashing)
D. 二分查找法(Binary Search)
第16题 中级 2.0分 判断
在C++语法中,表达式1e6、1000000和10^6的值是相同的。
T. 正确
F. 错误
第17题 中级 2.0分 判断
在C++语言中,函数调用前必须有函数声明或定义。
T. 正确
F. 错误
第18题 中级 2.0分 判断
快速排序一般是不稳定的。
T. 正确
F. 错误
第19题 中级 2.0分 判断
long long类型能表达的数都能使用double类型精确表达。
T. 正确
F. 错误
第20题 中级 2.0分 判断
使用math.h或cmath头文件中的函数,表达式cos(60)的结果类型为double、值约为0.5。
T. 正确
F. 错误
第21题 中级 2.0分 判断
一颗N层的满二叉树,一定有2^N-1个结点。
T. 正确
F. 错误
第22题 中级 2.0分 判断
邻接表和邻接矩阵都是图的存储形式。为了操作时间复杂度考虑,同一个图可以同时维护两种存储形式。
T. 正确
F. 错误
第23题 中级 2.0分 判断
子类对象包含父类的所有成员(包括私有成员)。从父类继承的私有成员也是子类的成员,因此子类可以直接访问。
T. 正确
F. 错误
第24题 中级 2.0分 判断
动态规划算法通常有递归实现和递推实现。但由于递归调用在运行时会由于层数过多导致程序崩溃,有些动态规划算法只能用递推实现。
T. 正确
F. 错误
第25题 中级 2.0分 判断
按照下面的规则生成一棵二叉树:以一个人为根节点,其父亲为左子节点,母亲为右子节点。对其父亲、母亲分别用同样规则生成左子树和右子树。以此类推,记录30代的直系家谱,则这是一棵满二叉树。
T. 正确
F. 错误
第26题 中级 25.0分 编程
图上移动

时间限制:1.0s 内存限制:512.0MB
小A有一张包含n个结点与m条边的无向图,结点以1,2,...,n标号。
小A会从图上选择一个结点作为起点,每一步移动到某个与当前小A所在结点相邻的结点。
对于每个结点i(1≤i≤n),小A想知道从结点i出发恰好移动1,2,...,k步之后,小A可能位于哪些结点。
由于满足条件的结点可能有很多,你只需要求出这些结点的数量。

【输入格式】
第一行,三个正整数n,m,k。接下来m行,每行两个正整数ui,vi,表示一条边。
【输出格式】
共n行,第i行包含k个整数,第j个整数表示从结点i出发恰好移动j步之后可能位于的结点数量。
【样例输入1】
4 4 3
1 2
1 3
2 3
3 4
【样例输出1】
2 3 3
2 3 4
2 4 3
1 2 3
对于所有测试点,保证1≤n≤500,1≤m≤500,1≤k≤25,1≤ui,vi≤n。
第27题 中级 25.0分 编程
等价消除

时间限制:1.0s 内存限制:512.0MB
小A有一个仅包含小写英文字母的字符串s。
对于一个字符串,如果能通过每次删去其中两个相同字符的方式,将这个字符串变为空串,那么称这个字符串是可以被等价消除的。
小A想知道s有多少子串是可以被等价消除的。
一个字符串s'是s的子串,当且仅当删去s的某个可以为空的前缀和某个可以为空的后缀之后,可以得到s'。

【输入格式】
第一行,一个正整数n,表示字符串s的长度。第二行,一个仅包含小写英文字母的字符串s。
【输出格式】
一行,一个整数,表示答案。
【样例输入1】
6
aaaaabb
【样例输出1】
9
【样例输入2】
9
babacabab
【样例输出2】
12
对于所有测试点,保证1≤|s|≤2×10⁵。
💬