202503 GESP认证 C++编程 七级真题试卷
剩余时间 --:--:--
单选题 共 15 题
1.

下列哪个选项是C++中的关键字?

2.

下面代码输出的是()

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


3.

以下代码的输出是什么?

1 int main() { 
2  int a = 10; 
3  int *p = &a; 
4  int *&q = p; 
5  *q = 20; 
6  cout << a << endl; 
7  return 0; 
8 }


4.

下面代码输出的是()

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


5.

下列关于排序的说法,正确的是( )

6.

下面关于C++类构造和析构函数的说法,错误的是( )。

7.

下列关于树和图的说法,错误的是( )。

8.

2025是个神奇的数字,因为它是由两个数20和25拼接而成,而且2025=(20+25)2。小杨决定写个程序找找小于N的正整数中共有多少这样神奇的数字。下面程序横线处应填入的是( )。

1 #include <string> 
2 int count_miracle(int N) { 
3  int cnt = 0; 
4  for (int n = 1; n * n < N; n++) { 
5   int n2 = n * n; 
6   std::string s = std::to_string(n2); 
7   for (int i = 1; i < s.length(); i++)
8    if (s[i] != '0') { 
9     std::string sl = s.substr(0, i); 
10     std::string sr = s.substr(i); 
11     int nl = std::stoi(sl); 
12     int nr = std::stoi(sr); 
13     if (_________) // 在此处填入选项 
14      cnt++; 
15    } 
16  } 
17  return cnt; 
18 }
9.

给定一个无向图,图的节点编号从0n-1,图的边以邻接表的形式给出。下面的程序使用深度优先搜索DFS)遍历该图,并输出遍历的节点顺序。横线处应该填入的是()

1 #include <iostream> 
2 #include <vector> 
3 #include <stack> 
4 using namespace std; 
5
6 void DFS(int start, vector<vector<int>>& graph, vector<bool>& visited) { 
7  stack<int> s; 
8  s.push(start); 
9  visited[start] = true; 
10
11  while (!s.empty()) { 
12   int node = s.top(); 
13   s.pop(); 
14   cout << node << " "; // 输出当前节点 
15
16   // 遍历邻接节点 
17   for (int neighbor : graph[node]) { 
18    if (!visited[neighbor]) { 
19     __________________ 
20     __________________ 
21
22    } 
23   } 
24  }
25 } 
26
27 int main() { 
28  int n, m; 
29  cin >> n >> m; 
30
31  vector<vector<int>> graph(n); 
32  for (int i = 0; i < m; i++) { 
33   int u, v; 
34   cin >> u >> v; 
35   graph[u].push_back(v); 
36   graph[v].push_back(u); 
37  } 
38
39
40  vector<bool> visited(n, false); 
41
42  // 从节点 0 开始DFS遍历 
43  DFS(0, graph, visited); 
44
45  return 0; 
46 }
10.

给定一个整数数组nums,找到其中最长的严格上升子序列的长度。 

子序列是指从原数组中删除一些元素(或不删除)后,剩余元素保持原有顺序的序列。 

下面的程序横线处应该填入的是()

1 #include <iostream> 
2 #include <vector> 
3 #include <algorithm> 
4 using namespace std; 
5
6 int lengthOfLIS(vector<int>& nums) { 
7  int n = nums.size();
8  if (n == 0) return 0; 
9  vector<int> dp(n, 1); 
10 
11  for (int i = 1; i < n; i++) { 
12   for (int j = 0; j < i; j++) { 
13    if (nums[i] > nums[j]) { 
14     _________________________ 
15    } 
16   } 
17  } 
18  return *max_element(dp.begin(), dp.end()); 
19 } 
20
21 int main() { 
22  int n; 
23  cin >> n; 
24  vector<int> nums(n); 
25  for (int i = 0; i < n; i++) { 
26   cin >> nums[i]; 
27  } 
28
29  int result = lengthOfLIS(nums); 
30  cout << result << endl; 
31
32  return 0; 
33 }


11.

给定一个整数数组nums,找到其中最长的严格上升子序列的长度。 

子序列是指从原数组中删除一些元素(或不删除)后,剩余元素保持原有顺序的序列。 

该程序的时间复杂度为()

1 #include <iostream> 
2 #include <vector> 
3 #include <algorithm> 
4 using namespace std; 
5
6 int lengthOfLIS(vector<int>& nums) { 
7  int n = nums.size(); 
8  if (n == 0) return 0; 
9  vector<int> dp(n, 1); 
10
11  for (int i = 1; i < n; i++) { 
12   for (int j = 0; j < i; j++) { 
13    if (nums[i] > nums[j]) { 
14     _________________________ 
15    } 
16   } 
17  }
18  return *max_element(dp.begin(), dp.end()); 
19 } 
20
21 int main() { 
22  int n; 
23  cin >> n; 
24  vector<int> nums(n); 
25  for (int i = 0; i < n; i++) { 
26   cin >> nums[i]; 
27  } 
28
29  int result = lengthOfLIS(nums); 
30  cout << result << endl; 
31
32  return 0; 
33 }


12.

给定两个无向图

G1G2 ,判断它们是否同构。图的同构是指两个图的节点可以通过某种重新编号的方式完全匹配,且边的连接关系一致。 

为了简化问题,假设图的节点编号从0n-1,并且图的边以邻接表的形式给出。下面程序中横线处应该给出的是 ()

1 #include <iostream> 
2 #include <vector> 
3 #include <map> 
4 #include <algorithm> 
5 using namespace std; 
6
7 string graphHash(vector<vector<int>>& graph) { 
8  vector<string> nodeHashes(graph.size()); 
9  for (int i = 0; i < graph.size(); i++) { 
10   vector<int> neighbors = graph[i]; 
11   sort(neighbors.begin(), neighbors.end()); 
12   string hash; 
13   for (int neighbor : neighbors) { 
14    —————————————————————————— 
15   } 
16   nodeHashes[i] = hash; 
17  } 
18  sort(nodeHashes.begin(), nodeHashes.end()); 
19  string finalHash; 
20  for (string h : nodeHashes) { 
21   finalHash += h + ";"; 
22  } 
23  return finalHash; 
24 }
25
26 int main() { 
27  int n; 
28  cin >> n; 
29
30  vector<vector<int>> G1(n); 
31  for (int i = 0; i < n; i++) { 
32   int k; 
33   while (cin >> k) { 
34    G1[i].push_back(k); 
35    if (cin.get() == '\n') break; 
36   } 
37  } 
38
39  vector<vector<int>> G2(n); 
40  for (int i = 0; i < n; i++) { 
41   int k; 
42   while (cin >> k) { 
43    G2[i].push_back(k); 
44    if (cin.get() == '\n') break; 
45   } 
46  } 
47
48  string hash1 = graphHash(G1); 
49  string hash2 = graphHash(G2); 
50
51  if (hash1 == hash2) { 
52   cout << "YES" << endl; 
53  } else { 
54   cout << "NO" << endl; 
55  } 
56
57  return 0; 
58 }


13.

给定一个m×n的二维网格grid,每个格子中有一个非负整数。请找出一条从左上角 (0, 0) 到右下角 (m-1, n-1) 的路径,使得路径上的数字总和最小。每次只能向右或向下移动。横线处应该填入的是()

1 #include <iostream> 
2 #include <vector> 
3 #include <algorithm> 
4 using namespace std; 
5
6 int minPathSum(vector<vector<int>>& grid) { 
7  int m = grid.size(); 
8  int n = grid[0].size(); 
9
10  vector<vector<int>> dp(m, vector<int>(n, 0));
11
12  dp[0][0] = grid[0][0]; 
13  for (int j = 1; j < n; j++) { 
14   dp[0][j] = dp[0][j - 1] + grid[0][j]; 
15  } 
16  for (int i = 1; i < m; i++) { 
17   dp[i][0] = dp[i - 1][0] + grid[i][0]; 
18  } 
19  for (int i = 1; i < m; i++) { 
20   for (int j = 1; j < n; j++) { 
21    ———————————————————————————————— 
22   } 
23  } 
24  return dp[m - 1][n - 1]; 
25 } 
26
27 int main() { 
28  int m, n; 
29  cin >> m >> n; 
30  vector<vector<int>> grid(m, vector<int>(n)); 
31  for (int i = 0; i < m; i++) { 
32   for (int j = 0; j < n; j++) { 
33    cin >> grid[i][j]; 
34   } 
35  } 
36  int result = minPathSum(grid); 
37  cout << result << endl; 
38
39  return 0; 
40 }
14.

给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。下面横线处应该填入的是()

1 #include <iostream> 
2 #include <vector> 
3 #include <algorithm> 
4 using namespace std; 
5
6 int maxSubArray(vector<int>& nums) { 
7  int n = nums.size(); 
8  if (n == 0) return 0; 
9
10  vector<int> dp(n, 0); 
11  dp[0] = nums[0]; 
12  int maxSum = dp[0]; 
13
14  for (int i = 1; i < n; i++) { 
15   _____________________________________
16   maxSum = max(maxSum, dp[i]); 
17  } 
18
19  return maxSum; 
20 } 
21
22 int main() { 
23  int n; 
24  cin >> n; 
25
26  vector<int> nums(n); 
27  for (int i = 0; i < n; i++) { 
28   cin >> nums[i]; 
29  } 
30
31  int result = maxSubArray(nums); 
32  cout << result << endl; 
33
34  return 0; 
35 }


15.

在哈希表的实现中,冲突解决是一个重要的问题。以下哪种方法不是常见的哈希表冲突解决策略?

判断题 共 10 题
1.

C++语法中,表达式1e6100000010^6的值是相同的。

2.

C++语言中,函数调用前必须有函数声明或定义。

3.

快速排序一般是不稳定的。

4.

long long类型能表达的数都能使用double类型精确表达。

5.

使用math.hcmath头文件中的函数,表达式cos(60)的结果类型为double、值约 0.5

6.

一颗N层的满二叉树,一定有2N-1个结点。

7.

邻接表和邻接矩阵都是图的存储形式。为了操作时间复杂度考虑,同一个图可以同时维护两种存储形式。

8.

子类对象包含父类的所有成员(包括私有成员)。从父类继承的私有成员也是子类的成员,因此子类可以直接访问。

9.

动态规划算法通常有递归实现和递推实现。但由于递归调用在运行时会由于层数过多导致程序崩溃,有些动态规划算法只能用递推实现。

10.

按照下面的规则生成一棵二叉树:以一个人为根节点,其父亲为左子节点,母亲为右子节点。对其父亲、母亲分别用同样规则生成左子树和右子树。以此类推,记录30代的直系家谱,则这是一棵满二叉树。

问答题 共 2 题
1.

3.1 编程题 1

时间限制:1.0 s

内存限制:512.0 MB

3.1.1 图上移动

3.1.2 题目描述

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

3.1.3 输入格式

第一行,三个正整数n,m,k,分别表示无向图的结点数与边数,最多移动的步数。

接下来m行,每行两个正整数ui,ui,表示图中的一条连接结点uiui的无向边。

3.1.4 输出格式

n行,第i行(1in)包含k个整数,第j个整数(1jk)表示从结点i出发恰好移动j步之后可能位于的结点数量。

3.1.5 样例

3.1.5.1 输入样例 1

3.1.5.2 输出样例 1

3.1.6 数据范围

对于20%的测试点,保证k=1

对于另外20%的测试点,保证1n501m50

对于所有测试点,保证1n5001m5001k201ui,uin

2.

3.2 编程题 2

时间限制:1.0 s

内存限制:512.0 MB

3.2.8 等价消除

3.2.9 题目描述

A有一个仅包含小写英文字母的字符串S

对于一个字符串,如果能通过每次删去其中两个相同字符的方式,将这个字符串变为空串,那么称这个字符串是可以被等价消除的。

A想知道S有多少子串是可以被等价消除的。

一个字符串SS的子串,当且仅当删去S的某个可以为空的前缀和某个可以为空的后缀之后,可以得到S

3.2.10 输入格式

第一行,一个正整数|S|,表示字符串S的长度。

第二行,一个仅包含小写英文字母的字符串S

3.2.11 输出格式

一行,一个整数,表示答案。

3.2.12 样例

3.2.12.3 输入样例 1

3.2.12.4 输出样例 1

3.2.12.5 输入样例 2

3.2.12.6 输出样例 2

3.2.13 数据范围

对于20%的测试点,保证S中仅包含ab两种字符。

对于另外20%的测试点,保证1|S|2000

对于所有测试点,保证1|S|2×105


C++ 编辑器
输入
输出