GESP:2024年3月 C++七级 真题及解析

四季读书网 2 0
GESP:2024年3月 C++七级 真题及解析
老师已为大家备好电子打印版,需要完整电子版文件的朋友,可以拉到文末查看
GESP:2024年3月 C++七级 真题及解析 第1张
GESP:2024年3月 C++七级 真题及解析 第2张
GESP:2024年3月 C++七级 真题及解析 第3张
GESP:2024年3月 C++七级 真题及解析 第4张
GESP:2024年3月 C++七级 真题及解析 第5张
GESP:2024年3月 C++七级 真题及解析 第6张
GESP:2024年3月 C++七级 真题及解析 第7张

【答案解析】

1.解释:答案选B。
详细解析见下图——
GESP:2024年3月 C++七级 真题及解析 第8张

相关知识点的复习与拓展:

截至考试当年3月,有关十大经典排序算法的特点对比,可以参考下图帮助记忆——

GESP:2024年3月 C++七级 真题及解析 第9张

2.解释:答案选C。

详细解析见下图——
GESP:2024年3月 C++七级 真题及解析 第10张
GESP:2024年3月 C++七级 真题及解析 第11张
GESP:2024年3月 C++七级 真题及解析 第12张

3.解释:答案选D。

详细解析见下图——
GESP:2024年3月 C++七级 真题及解析 第13张

4.解释:答案选C。

详细解析见下图——
GESP:2024年3月 C++七级 真题及解析 第14张

5.解释:答案选D。

详细解析见下图——
哈希冲突是指不同的关键字通过哈希函数映射到了同一个地址。解决或缓解冲突的目标是确保所有数据都能被正确存储和检索,而不是丢失数据。
A.在每个哈希表项处,使用单链表管理该表项的冲突元素:这是链地址法(Separate Chaining)的标准实现方式。当发生冲突时,将新元素添加到对应槽位的链表中。这是一种非常常见且合理的解决冲突的方法。
B.建立额外的单链表,用来管理所有发生冲突的元素:这类似于公共溢出区法。主表存放无冲突或首次映射的元素,所有发生冲突的元素可以统一存放到一个额外的区域(如链表或数组)中,并通过指针或索引关联。这也是一种可行的解决思路。
C.使用不同的哈希函数再建立一个哈希表,用来管理所有发生冲突的元素:这属于再哈希法(Rehashing)或双重散列的一种变体思想。当发生冲突时,使用另一个哈希函数计算新的位置,或者将冲突元素存入由第二个哈希函数管理的结构中。这也是合理的冲突处理策略。
D.用新元素覆盖发生冲突的哈希表项:如果直接用新元素覆盖旧元素,会导致原有数据丢失,无法再通过哈希表找回被覆盖的数据。这违背了数据存储的基本目的,因此不能作为解决或缓解冲突的方案。
综上所述,选项D会导致数据丢失,是不合理的方案。

6.解释:答案选B。

根据给定的中序遍历序列 {C, F, B, A, E, D, G} 和后序遍历序列 {F, C, B, E, G, D, A},我们可以重构这棵二叉树。

1. 重构二叉树步骤:‌

● 确定根节点‌:后序遍历的最后一个元素是根节点,即 ‌A‌

 划分左右子树‌:在中序遍历中找到 AA 左边 {C, F, B} 是左子树的中序遍历,A 右边 {E, D, G} 是右子树的中序遍历。

○ 左子树节点集合:{C, F, B}

○ 右子树节点集合:{E, D, G}

● 构建左子树‌:

○ 在后序遍历中,对应左子树节点 

{C, F, B} 的部分是 {F, C, B}(保持相对顺序)。最后一个元素 ‌B‌ 是左子树的根。

○ 在中序遍历 {C, F, B} 中,B 的左边 {C, F} 是 B 的左子树,B 没有右子树。

○ 对于 B 的左子树 {C, F}

  ✦后序遍历中对应部分是 {F, C},最后一个元素 ‌C‌ 是根。

  ✦在中序遍历 {C, F} 中,C 的右边是 ‌F‌,所以 F 是 C 的右孩子。

○ 左子树结构‌:根 B,左孩子 CC 的右孩子 F

● 构建右子树‌:

在后序遍历中,对应右子树节点 {E, D, G} 的部分是 {E, G, D}。最后一个元素 ‌D‌ 是右子树的根。

在中序遍历 {E, D, G} 中,D 的左边是 ‌E‌,右边是 ‌G‌

所以 E 是 D 的左孩子,G 是 D 的右孩子。

右子树结构‌:根 D,左孩子 E,右孩子 G

2. 最终二叉树结构:‌

GESP:2024年3月 C++七级 真题及解析 第15张
A. 该树是平衡二叉树 ❌,节点 B 的平衡因子为 -2(左子树高 1,右子树高 3),不满足AVL树平衡条件(|平衡因子| ≤ 1)。
B. 该树的高为4 ✅,从根A到最深叶子F的路径:A → B → C → F,共4层,高度为 4。
C. 该树有 4 个叶节点 ❌,叶子节点:F、E、G,共 3 个叶节点。

7.解释:答案选A。

详细解析见下图——
GESP:2024年3月 C++七级 真题及解析 第16张

8.解释:答案选B。

详细解析见下图——
GESP:2024年3月 C++七级 真题及解析 第17张

9.解释:答案选A。

详细解析见下图——
GESP:2024年3月 C++七级 真题及解析 第18张

10.解释:答案选C。

详细解析见下图——
GESP:2024年3月 C++七级 真题及解析 第19张
GESP:2024年3月 C++七级 真题及解析 第20张
GESP:2024年3月 C++七级 真题及解析 第21张
GESP:2024年3月 C++七级 真题及解析 第22张

11.解释:答案选C。

详细解析见下图——
GESP:2024年3月 C++七级 真题及解析 第23张
GESP:2024年3月 C++七级 真题及解析 第24张

12.解释:答案选B。

详细解析见下图——

GESP:2024年3月 C++七级 真题及解析 第25张
GESP:2024年3月 C++七级 真题及解析 第26张
GESP:2024年3月 C++七级 真题及解析 第27张

13.解释:答案选C。

详细解析见下图——

GESP:2024年3月 C++七级 真题及解析 第28张

14.解释:答案选A。

详细解析见下图——
GESP:2024年3月 C++七级 真题及解析 第29张

15.解释:答案选B。

详细解析见下图——
GESP:2024年3月 C++七级 真题及解析 第30张
GESP:2024年3月 C++七级 真题及解析 第31张
GESP:2024年3月 C++七级 真题及解析 第32张

【答案解析】

1.解释:正确。
本题考察数学和计算机历史,就是一道常识题,跟计算机关系不大。祖冲之最先将圆周率算到了小数点后第七位。

2.解释:错误。

考察考察位运算的相关知识。请注意,在C++语言中,符号 ^ 为异或运算符,而不是日常表示的乘方运算。同理,两个星号( ** )在Python中表示乘方,但是在C++中没有对应的定义。详细解析见下图——

GESP:2024年3月 C++七级 真题及解析 第33张

相关知识点的复习与拓展:

截至考试当年3月,有关位运算符的相关知识点,详见下图——

GESP:2024年3月 C++七级 真题及解析 第34张
GESP:2024年3月 C++七级 真题及解析 第35张
GESP:2024年3月 C++七级 真题及解析 第36张

3.解释:正确。

详细解析见下图——

GESP:2024年3月 C++七级 真题及解析 第37张

4.解释:错误。

本题考察动态规划和谈心算法贪心的相关知识。能用动态规划解决的问题 ,不一定可以用贪心算法解决,题干表述错误。

5.解释:错误。

本题考察使用 math.h 或 cmath 头文件中的正弦函数的相关知识。sin() 函数的参数是弧度而不是角度,题干表述错误。

相关知识点的复习与拓展:

截至考试当年3月初等数学中有关弧度与圆心角度数的转换关系,详见下图——

GESP:2024年3月 C++七级 真题及解析 第38张

6.解释:正确。

详细解析见下图——

GESP:2024年3月 C++七级 真题及解析 第39张

7.解释:错误。

详细解析见下图——

GESP:2024年3月 C++七级 真题及解析 第40张

8.解释:正确。

详细解析见下图——

GESP:2024年3月 C++七级 真题及解析 第41张

9.解释:正确。

详细解析见下图——

GESP:2024年3月 C++七级 真题及解析 第42张

10.解释:正确。

详细解析见下图——

GESP:2024年3月 C++七级 真题及解析 第43张

相关知识点的复习与拓展:

作为日常学习研究,我们可以在编译器内写一个例子,验证上面的思路——

#include<iostream>using namespace std;// 抽象类 Aclass A {public:    virtualvoidf()0// 纯虚函数    virtual ~A() {}       // 良好的编程习惯:为抽象类定义虚析构函数};// 类 B 继承自 A,但未实现纯虚函数 fclass B : public A {    // B 仍然是抽象类,因为它没有实现 A::f()};intmain(){    B b; // 这行代码会导致编译错误!    // 错误信息类似于:cannot declare variable 'b' to be of abstract type 'B'    return 0;}
正确运行的的代码示例如下——
#include<iostream>using namespace std;// 抽象类 Aclass A {public:    virtualvoidf()0// 纯虚函数    virtual ~A() {}       // 良好的编程习惯:为抽象类定义虚析构函数};// 类 B 继承自 A,并实现了纯虚函数 fclass B : public A {public:    voidf()override// 使用 override 关键字明确表示重写        std::cout << "类 B 实现了函数 f()" << std::endl;    }};intmain(){    B b;      // 现在可以成功实例化类 B 的对象    b.f();    // 输出: 类 B 实现了函数 f()    return 0;}
程序可以正常运行并正确输出——
GESP:2024年3月 C++七级 真题及解析 第44张
GESP:2024年3月 C++七级 真题及解析 第45张
GESP:2024年3月 C++七级 真题及解析 第46张
GESP:2024年3月 C++七级 真题及解析 第47张

GESP 2024年3月 C++七级 交流问题

#include<iostream>#include<vector>#include<queue>#include<cstring>using namespace std;intmain(){    ios::sync_with_stdio(false);    cin.tie(nullptr);    int N, M;    cin >> N >> M;    // 构建邻接表    vector<vector<int>> adj(N + 1);    for (int i = 0; i < M; i++) {        int u, v;        cin >> u >> v;        adj[u].push_back(v);        adj[v].push_back(u);    }    vector<boolvisited(N + 1false);    int minB = 0, maxB = 0;    // BFS 遍历每个连通块    for (int i = 1; i <= N; i++) {        if (!visited[i]) {            queue<int> q;            q.push(i);            visited[i] = true;            // color 数组:0 表示未染色,-1 和 1 表示两种不同颜色            // 这里我们用 -1 代表 A 校,1 代表 B 校,或者反过来也可以            // 只需要知道相对关系            vector<intcolor(N + 10);            color[i] = 1;  // 假设节点 i 染成颜色 1(代表 B 校)            int cnt = 0;   // 统计颜色 1(B 校)的数量            int size = 0;  // 连通块大小            while (!q.empty()) {                int u = q.front();                q.pop();                size++;                if (color[u] == 1) cnt++;  // 如果是颜色 1,则计入 B 校人数                for (int v : adj[u]) {                    if (!visited[v]) {                        visited[v] = true;                        color[v] = -color[u];  // 相邻节点染相反颜色                        q.push(v);                    }                }            }            // 对于当前连通块,有两种染色方案:            // 方案1:当前 color 为 1 的代表 B 校 -> cnt 人            // 方案2:当前 color 为 1 的代表 A 校(即取反) -> size - cnt 人            minB += min(cnt, size - cnt);            maxB += max(cnt, size - cnt);        }    }    cout << minB << " " << maxB << endl;    return 0;}
代码思路——
GESP:2024年3月 C++七级 真题及解析 第48张

GESP:2024年3月 C++七级 真题及解析 第49张
GESP:2024年3月 C++七级 真题及解析 第50张

GESP 2024年3月 C++七级 俄罗斯方块

#include<iostream>#include<vector>#include<queue>#include<set>#include<algorithm>using namespace std;// 定义方向数组:上、下、左、右int dr[] = {-1100};int dc[] = {00-11};int n, m;vector<vector<int>> grid;vector<vector<bool>> visited;// 用于存储当前连通块的所有坐标vector<pair<intint>> current_shape;// BFS 搜索连通块voidbfs(int start_r, int start_c, int color){    queue<pair<intint>> q;    q.push({start_r, start_c});    visited[start_r][start_c] = true;    // 记录当前连通块的最小行和最小列,用于后续归一化    int min_r = start_r;    int min_c = start_c;    current_shape.push_back({start_r, start_c});    while (!q.empty()) {        auto [r, c] = q.front();        q.pop();        for (int i = 0; i < 4; i++) {            int nr = r + dr[i];            int nc = c + dc[i];            // 检查边界、是否访问过、颜色是否相同            if (nr >= 0 && nr < n && nc >= 0 && nc < m &&                 !visited[nr][nc] && grid[nr][nc] == color) {                visited[nr][nc] = true;                q.push({nr, nc});                current_shape.push_back({nr, nc});                // 更新最小坐标                if (nr < min_r) min_r = nr;                if (nc < min_c) min_c = nc;            }        }    }}intmain(){    // 优化 I/O 速度    ios_base::sync_with_stdio(false);    cin.tie(NULL);    if (!(cin >> n >> m)) return 0;    grid.resize(n, vector<int>(m));    visited.resize(n, vector<bool>(m, false));    for (int i = 0; i < n; i++) {        for (int j = 0; j < m; j++) {            cin >> grid[i][j];        }    }    // 使用 set 存储不同的形状。    // vector<pair<int,int>> 可以直接作为 set 的 key,因为它支持字典序比较。    set<vector<pair<intint>>> unique_shapes;    for (int i = 0; i < n; i++) {        for (int j = 0; j < m; j++) {            if (!visited[i][j]) {                current_shape.clear();                // 1. 找到连通块并记录坐标                bfs(i, j, grid[i][j]);                // 2. 归一化(平移至原点)                // 找到该形状中最小的行和列                int min_r = n, min_c = m;                for (auto& p : current_shape) {                    if (p.first < min_r) min_r = p.first;                    if (p.second < min_c) min_c = p.second;                }                // 将所有坐标减去 (min_r, min_c)                for (auto& p : current_shape) {                    p.first -= min_r;                    p.second -= min_c;                }                // 3. 存入 set 去重                // 注意:set 会自动对 vector 进行排序和去重                unique_shapes.insert(current_shape);            }        }    }    cout << unique_shapes.size() << endl;    return 0;}
代码思路——
GESP:2024年3月 C++七级 真题及解析 第51张
GESP:2024年3月 C++七级 真题及解析 第52张

课程体系——

GESP:2024年3月 C++七级 真题及解析 第53张
需要无水印PDF格式文件,
或者课程体系咨询,
欢迎扫描下面二维码添加好友垂询。
GESP:2024年3月 C++七级 真题及解析 第54张

GESP:2024年3月 C++七级 真题及解析 第55张

▍ 声明:本文整理自网络,如有侵权,请联系删除。

本公号刊载此文,是出于合法合理地分享和传播信息,扩大大受众范围,促进学术交流,推动共同进步之目的。公众号持有人郑重声明,本文的发布,将严格遵守相关规定和法律法规,不侵犯任意潜在作者的权益,不改变引用原文(若有)的意图和内容。若有来源标注错误或侵犯了您的合法权益,请随时与我们联系协商,联系(QQ):993225721,我们将及时更正、删除。文章若有幸得到转载,首先,公众号持有人感谢转载人为读者阅读提供了有价值的信息和知识,希望文章能够在被转载的平台上得到更广泛的传播和交流;其次,转载人应充分考虑到转载动作本身所可能带来的相应的风险和责任,包括但不限于侵犯知识产权、侵犯他人权益等行为所引起的法律责任,确保本文的合法传播和使用。同时,本人也极其愿意在转载过程中尽力配合转载人了解、关注、规避、消除相关的潜在风险。若转载人有相任何关疑虑,同样欢迎随时与我们联系协商,联系(QQ):993225721。

喜欢您关注我们哦——

抱歉,评论功能暂时关闭!