#GESP2025037K. GESP-C++ 七级客观题202503K
GESP-C++ 七级客观题202503K
一、单选题(每题 分,共 分)
下列哪个选项是C++中的关键字?
{{ select(1) }}
- function
- class
- method
- object
下面代码输出的是()
1 int main() {
2 int a = 5, b = 2;
3 cout << (a >> b) << endl;
4 }
{{ select(2) }}
- 1
- 2
- 5
- 10
以下代码的输出是什么?
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 }
{{ select(3) }}
- 10
- 20
- 地址值
- 编译错误
下面代码输出的是()
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 }
{{ select(4) }}
- 1
- 2
- 3
- 4
下列关于排序的说法,正确的是( )。
{{ select(5) }}
- 选择排序是最快的排序算法之一。
- 归并排序通常是稳定的。
- 最差情况, 个元素做快速排序的时间复杂度为 。
- 最好情况, 个元素做插入排序的时间复杂度为 。
下面关于C++类构造和析构函数的说法,错误的是( )。
{{ select(6) }}
- 构造函数不能声明为虚函数。
- 析构函数必须声明为虚函数。
- 类的默认构造函数可以被声明为private。
- 类的析构函数可以被声明为private。
下列关于树和图的说法,错误的是( )。
{{ select(7) }}
- 树是一种有向无环图,但有向无环图不都是一棵树。
- 如果把树看做有向图,每个节点指向其子节点,则该图是强连通图。
- 个顶点且连通的无向图,其最小生成树一定包含 个条边。
- 个顶点、 条边的有向图,一定不是强连通的。
2025是个神奇的数字,因为它是由两个数20和25拼接而成,而且。小杨决定写个程序找找小于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 if (s[i] != '0') {
8 std::string sl = s.substr(0, i);
9 std::string sr = s.substr(i);
10 int nl = std::stoi(sl);
11 int nr = std::stoi(sr);
12 if (_________) // 在此处填入选项
13 cnt++;
14 }
15 }
16 return cnt;
17 }
{{ select(8) }}
- nl + nr == n
- nl + nr == n2
- (nl + nr) * (nl + nr) == n
- (nl + nr) ^ 2 == n2
给定一个无向图,图的节点编号从 0 到 n-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 while (!s.empty()) {
11 int node = s.top();
12 s.pop();
13 cout << node << " "; // 输出当前节点
14 // 遍历邻接节点
15 for (int neighbor : graph[node]) {
16 if (!visited[neighbor]) {
17 __________________
18 __________________
19 }
20 }
21 }
22 }
23
24 int main() {
25 int n, m;
26 cin >> n >> m;
27 vector<vector<int>> graph(n);
28 for (int i = 0; i < m; i++) {
29 int u, v;
30 cin >> u >> v;
31 graph[u].push_back(v);
32 graph[v].push_back(u);
33 }
34 vector<bool> visited(n, false);
35 // 从节点 0 开始DFS遍历
36 DFS(0, graph, visited);
37 return 0;
38 }
{{ select(9) }}
- 
- 
给定一个整数数组 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 for (int i = 1; i < n; i++) {
11 for (int j = 0; j < i; j++) {
12 if (nums[i] > nums[j]) {
13 _________________________
14 }
15 }
16 }
17 return *max_element(dp.begin(), dp.end());
18 }
19
20 int main() {
21 int n;
22 cin >> n;
23 vector<int> nums(n);
24 for (int i = 0; i < n; i++) {
25 cin >> nums[i];
26 }
27 int result = lengthOfLIS(nums);
28 cout << result << endl;
29 return 0;
30 }
{{ select(10) }}
- dp[i] = max(dp[i], dp[j]);
- dp[i] = max(dp[i+1], dp[j] + 1);
- dp[i] = max(dp[i], dp[j] - 1);
- dp[i] = max(dp[i], dp[j] + 1);
给定一个整数数组 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 for (int i = 1; i < n; i++) {
11 for (int j = 0; j < i; j++) {
12 if (nums[i] > nums[j]) {
13 _________________________
14 }
15 }
16 }
17 return *max_element(dp.begin(), dp.end());
18 }
19
20 int main() {
21 int n;
22 cin >> n;
23 vector<int> nums(n);
24 for (int i = 0; i < n; i++) {
25 cin >> nums[i];
26 }
27 int result = lengthOfLIS(nums);
28 cout << result << endl;
29 return 0;
30 }
{{ select(11) }}
-
( O(n^2) )
-
( O(n) )
-
( O(log(n)) )
-
( O(nlog(n)) )
给定两个无向图 G1和 G2 ,判断它们是否同构。图的同构是指两个图的节点可以通过某种重新编号的方式完全匹配,且边的连接关系一致。 为了简化问题,假设图的节点编号从 0 到 n-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 vector<vector<int>> G1(n);
30 for (int i = 0; i < n; i++) {
31 int k;
32 while (cin >> k) {
33 G1[i].push_back(k);
34 if (cin.get() == '\n') break;
35 }
36 }
37 vector<vector<int>> G2(n);
38 for (int i = 0; i < n; i++) {
39 int k;
40 while (cin >> k) {
41 G2[i].push_back(k);
42 if (cin.get() == '\n') break;
43 }
44 }
45 string hash1 = graphHash(G1);
46 string hash2 = graphHash(G2);
47 if (hash1 == hash2) {
48 cout << "YES" << endl;
49 } else {
50 cout << "NO" << endl;
51 }
52 return 0;
53 }
{{ select(12) }}
- hash += to_string(neighbor);
- hash += to_string(neighbors);
- hash += to_string(neighbor) + ",";
- hash -= to_string(neighbors);
给定一个 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 vector<vector<int>> dp(m, vector<int>(n, 0));
10 dp[0][0] = grid[0][0];
11 for (int j = 1; j < n; j++) {
12 dp[0][j] = dp[0][j - 1] + grid[0][j];
13 }
14 for (int i = 1; i < m; i++) {
15 dp[i][0] = dp[i - 1][0] + grid[i][0];
16 }
17 for (int i = 1; i < m; i++) {
18 for (int j = 1; j < n; j++) {
19 ————————————————————————————————
20 }
21 }
22 return dp[m - 1][n - 1];
23 }
24
25 int main() {
26 int m, n;
27 cin >> m >> n;
28 vector<vector<int>> grid(m, vector<int>(n));
29 for (int i = 0; i < m; i++) {
30 for (int j = 0; j < n; j++) {
31 cin >> grid[i][j];
32 }
33 }
34 int result = minPathSum(grid);
35 cout << result << endl;
36 return 0;
37 }
{{ select(13) }}
- dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][1];
- dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
- dp[i][j] = min(dp[i - 1][j], dp[i][j]) + grid[i][j];
- dp[i][j] = min(dp[i][j], dp[i][j - 1]) + grid[i][j];
给定一个整数数组 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 vector<int> dp(n, 0);
10 dp[0] = nums[0];
11 int maxSum = dp[0];
12 for (int i = 1; i < n; i++) {
13 maxSum = max(maxSum, dp[i]);
14 }
15 return maxSum;
16 }
17
18 int main() {
19 int n;
20 cin >> n;
21 vector<int> nums(n);
22 for (int i = 0; i < n; i++) {
23 cin >> nums[i];
24 }
25 int result = maxSubArray(nums);
26 cout << result << endl;
27 return 0;
28 }
{{ select(14) }}
- dp[i] = max(nums[i+1], dp[i - 1] + nums[i]);
- dp[i] = max(nums[i], dp[i - 1] + nums[i]);
- dp[i] = max(nums[i], dp[i + 1] + nums[i]);
- dp[i] = max(nums[i], dp[i - 1] + nums[i+1]);
在哈希表的实现中,冲突解决是一个重要的问题。以下哪种方法 不是 常见的哈希表冲突解决策略?
{{ select(15) }}
- 链地址法(Chaining)
- 开放地址法(Open Addressing)
- 二次哈希法(Double Hashing)
- 二分查找法(Binary Search)
二、判断题(每题 分,共 分)
在C++语法中,表达式 1e6 、 1000000 和 10^6 的值是相同的。
{{ select(16) }}
- 正确
- 错误
在C++语言中,函数调用前必须有函数声明或定义。
{{ select(17) }}
- 正确
- 错误
快速排序一般是不稳定的。
{{ select(18) }}
- 正确
- 错误
long long 类型能表达的数都能使用 double 类型精确表达。
{{ select(19) }}
- 正确
- 错误
使用 math.h 或 cmath 头文件中的函数,表达式 cos(60) 的结果类型为 double 、值约为 0.5 。
{{ select(20) }}
- 正确
- 错误
一颗N层的满二叉树,一定有个结点。
{{ select(21) }}
- 正确
- 错误
邻接表和邻接矩阵都是图的存储形式。为了操作时间复杂度考虑,同一个图可以同时维护两种存储形式。
{{ select(22) }}
- 正确
- 错误
子类对象包含父类的所有成员(包括私有成员)。从父类继承的私有成员也是子类的成员,因此子类可以直接访问。
{{ select(23) }}
- 正确
- 错误
动态规划算法通常有递归实现和递推实现。但由于递归调用在运行时会由于层数过多导致程序崩溃,有些动态规划算法只能用递推实现。
{{ select(24) }}
- 正确
- 错误
按照下面的规则生成一棵二叉树:以一个人为根节点,其父亲为左子节点,母亲为右子节点。对其父亲、母亲分别用同样规则生成左子树和右子树。以此类推,记录30代的直系家谱,则这是一棵满二叉树。
{{ select(25) }}
- 正确
- 错误