老师已为大家备好电子打印版,需要完整电子版文件的朋友,可以拉到文末查看。 【答案解析】
1.解释:答案选B。 详细解析见下图—— 相关知识点的复习与拓展:
截至考试当年3月,有关十大经典排序算法的特点对比,可以参考下图帮助记忆——
2.解释:答案选C。
详细解析见下图—— 3.解释:答案选D。
详细解析见下图—— 4.解释:答案选C。
详细解析见下图—— 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。
○ 划分左右子树:在中序遍历中找到 A,A 左边 {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,左孩子 C,C 的右孩子 F。
● 构建右子树:
在后序遍历中,对应右子树节点 {E, D, G} 的部分是 {E, G, D}。最后一个元素 D 是右子树的根。
在中序遍历 {E, D, G} 中,D 的左边是 E,右边是 G。
所以 E 是 D 的左孩子,G 是 D 的右孩子。
右子树结构:根 D,左孩子 E,右孩子 G。
2. 最终二叉树结构:
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。
详细解析见下图——8.解释:答案选B。
详细解析见下图—— 9.解释:答案选A。
详细解析见下图——10.解释:答案选C。
详细解析见下图—— 11.解释:答案选C。
详细解析见下图—— 12.解释:答案选B。
详细解析见下图——
13.解释:答案选C。
详细解析见下图——
14.解释:答案选A。
详细解析见下图——15.解释:答案选B。
详细解析见下图——
【答案解析】
1.解释:正确。 本题考察数学和计算机历史,就是一道常识题,跟计算机关系不大。祖冲之最先将圆周率算到了小数点后第七位。 2.解释:错误。
考察考察位运算的相关知识。请注意,在C++语言中,符号 ^ 为异或运算符,而不是日常表示的乘方运算。同理,两个星号( ** )在Python中表示乘方,但是在C++中没有对应的定义。详细解析见下图——
相关知识点的复习与拓展:
截至考试当年3月,有关位运算符的相关知识点,详见下图——
3.解释:正确。
详细解析见下图——
4.解释:错误。
本题考察动态规划和谈心算法贪心的相关知识。能用动态规划解决的问题 ,不一定可以用贪心算法解决,题干表述错误。
5.解释:错误。
本题考察使用 math.h 或 cmath 头文件中的正弦函数的相关知识。sin() 函数的参数是弧度而不是角度,题干表述错误。
相关知识点的复习与拓展:
截至考试当年3月,初等数学中有关弧度与圆心角度数的转换关系,详见下图——
6.解释:正确。
详细解析见下图——
7.解释:错误。
详细解析见下图——
8.解释:正确。
详细解析见下图——
9.解释:正确。
详细解析见下图——
10.解释:正确。
详细解析见下图——
相关知识点的复习与拓展:
作为日常学习研究,我们可以在编译器内写一个例子,验证上面的思路——
#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++七级 交流问题
#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<bool> visited(N + 1, false);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<int> color(N + 1, 0);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++七级 俄罗斯方块
#include<iostream>#include<vector>#include<queue>#include<set>#include<algorithm>using namespace std;// 定义方向数组:上、下、左、右int dr[] = {-1, 1, 0, 0};int dc[] = {0, 0, -1, 1};int n, m;vector<vector<int>> grid;vector<vector<bool>> visited;// 用于存储当前连通块的所有坐标vector<pair<int, int>> current_shape;// BFS 搜索连通块voidbfs(int start_r, int start_c, int color){queue<pair<int, int>> 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<int, int>>> 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;}代码思路—— 课程体系——
需要无水印PDF格式文件, 或者课程体系咨询, 欢迎扫描下面二维码添加好友垂询。
▍ 声明:本文整理自网络,如有侵权,请联系删除。
本公号刊载此文,是出于合法合理地分享和传播信息,扩大大受众范围,促进学术交流,推动共同进步之目的。公众号持有人郑重声明,本文的发布,将严格遵守相关规定和法律法规,不侵犯任意潜在作者的权益,不改变引用原文(若有)的意图和内容。若有来源标注错误或侵犯了您的合法权益,请随时与我们联系协商,联系(QQ):993225721,我们将及时更正、删除。文章若有幸得到转载,首先,公众号持有人感谢转载人为读者阅读提供了有价值的信息和知识,希望文章能够在被转载的平台上得到更广泛的传播和交流;其次,转载人应充分考虑到转载动作本身所可能带来的相应的风险和责任,包括但不限于侵犯知识产权、侵犯他人权益等行为所引起的法律责任,确保本文的合法传播和使用。同时,本人也极其愿意在转载过程中尽力配合转载人了解、关注、规避、消除相关的潜在风险。若转载人有相任何关疑虑,同样欢迎随时与我们联系协商,联系(QQ):993225721。 喜欢您关注我们哦——






















































