GESP:2024年6月 C++四级 真题及解析

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

【答案解析】

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

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

截至考试当年9月,关于指针传递/地址传递值传递的区别,可以参考下面视频所示,加深理解——
已关注
关注
重播 分享

2.解释:答案选B。

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

3.解释:答案选B。

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

4.解释:答案选D。

详细解析见下图——
GESP:2024年6月 C++四级 真题及解析 第15张

5.解释:答案选B。

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

6.解释:答案选D。

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

7.解释:答案选D。

直接插入排序是一种简单的插入排序法,其基本思想是: 

● 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

● 在待排序的元素中,假设前 n-1 个元素已有序,现将第 n 个元素插入到前面已经排好的序列中,使得前 n 个元素有序。按照此法对所有元素进行插入,直到整个序列有序。

GESP:2024年6月 C++四级 真题及解析 第18张

综上所述,就地排序只需要O(1)的额外空间。

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

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

GESP:2024年6月 C++四级 真题及解析 第19张

8.解释:答案选A。

详细解析见下图——
GESP:2024年6月 C++四级 真题及解析 第20张

9.解释:答案选A。

自己调用自己是递归的表现,而不是递推,注意区分。除了选项A表述错误以外,其他选项的表述均正确。

选项A符合题干要求。

10.解释:答案选B。

在冒泡排序中,两个元素交换的条件是 a[j]>a[j+1] ,如果两个元素的值相等,他们并不会发生交换,因此是一种稳定的排序算法。

选项B表述错误。

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

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

GESP:2024年6月 C++四级 真题及解析 第21张

11.解释:答案选A。

详细解析见下图——
GESP:2024年6月 C++四级 真题及解析 第22张

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

截至考试当年6月,有关冒泡排序的实现原理,可以参考下面视频所示,加深理解——
已关注
关注
重播 分享

12.解释:答案选D。

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

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

截至考试当年6月,有关插入排序的实现原理,可以参考下面视频所示,加深理解——
已关注
关注
重播 分享

13.解释:答案选A。

详细解析见下图——
GESP:2024年6月 C++四级 真题及解析 第24张
GESP:2024年6月 C++四级 真题及解析 第25张

14.解释:答案选B。

详细解析见下图——
GESP:2024年6月 C++四级 真题及解析 第26张

15.解释:答案选D。

详细解析见下图——
GESP:2024年6月 C++四级 真题及解析 第27张
GESP:2024年6月 C++四级 真题及解析 第28张
GESP:2024年6月 C++四级 真题及解析 第29张
GESP:2024年6月 C++四级 真题及解析 第30张

【答案解析】

1.解释:错误。
这种说法是不正确的,int& a 和 &a 并不一样:
int& a‌ :这是引用的声明语法。在C++中,引用是变量的一个别名,代表的是变量本身,而不是取变量的地址。引用在声明时必须初始化,例如 int b = 10; int& a = b; ,此时 a 就是 b 的别名,对 a 的操作就是对 b 的操作,它们共享同一块内存空间。
&a‌:当 a 是一个变量时,&a 中的 & 是取地址运算符,它是一个单目运算符,表示获取变量 a 在内存中的地址。例如 int a = 10; int* p = &a; ,这里 &a 把变量 a 的地址赋给了指针 p 。
所以, int& a 和 &a 有着本质的区别,前者是声明一个引用,后者是获取变量的地址。

2.解释:正确。

同上一题,int& ra 是引用变量,必须在定义的同时设置初始值。

3.解释:正确。

引用是指针常量,指向的内存地址,无法修改,而指向的内存地址对应值的指针变量,其值是可以可以修改的。

4.解释:正确。

输出 a 即直接输出数组 a 的首地址,而 a[0][0] 是数组 a 的第0个元素,因此 &a[0][0] 相当于就是取了第 0 个元素的地址,即首地址。

5.解释:错误。

递归算法的实现就是“函数调用自己”。

6.解释:正确。

常量无法被修改,因此若想要实参的值不被修改,传入常量即可。

7.解释:正确。

NULL 使指针指向0地址,大多数系统中都将0作为不被使用的地址,因此,空指针不指向任何对象。

8.解释:正确。

整型二维数组中的每一个元素都是一个整型变量。

9.解释:正确。

合法的6个数组分别是{6}、{6,1}、{6,2}、{6,3}、{6,3,1}、{6,2,1}。

10.解释:正确。

在最坏的逆序情况下,每一个元素都会被插入到已排好序部分的最前面。

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

截至考试当年6月,有关插入排序的实现原理,可以参考下面视频所示,加深理解——
已关注
关注
重播 分享
GESP:2024年6月 C++四级 真题及解析 第31张
GESP:2024年6月 C++四级 真题及解析 第32张

GESP 2024年6月 C++四级 黑白方块

#include<iostream>#include<vector>#include<unordered_map>#include<algorithm>#include<climits>using namespace std;intmain(){    int n, m;    cin >> n >> m;    vector<string> grid(n);    for (int i = 0; i < n; ++i) {        cin >> grid[i];    }    int max_area = 0;    // 固定上边界    for (int top = 0; top < n; ++top) {        vector<intcol_sum(m, 0);  // 记录每列从top到当前bottom的和        // 扩展下边界        for (int bottom = top; bottom < n; ++bottom) {            // 更新当前列的和            for (int j = 0; j < m; ++j) {                col_sum[j] += (grid[bottom][j] == '1' ? 1 : -1);            }            // 一维数组找和为0的最长子数组            unordered_map<intint> prefix_map;            prefix_map[0] = -1;  // 前缀和为0的初始位置在-1(还没开始遍历)            int current_prefix = 0;            for (int j = 0; j < m; ++j) {                current_prefix += col_sum[j];                // 如果当前前缀和之前出现过,说明中间的子数组和为0                if (prefix_map.count(current_prefix)) {                    int length = j - prefix_map[current_prefix];                    int area = length * (bottom - top + 1);                    max_area = max(max_area, area);                } else {                    // 只保存第一次出现的位置,保证子数组最长                    prefix_map[current_prefix] = j;                }            }        }    }    cout << max_area << endl;    return 0;}
代码思路——
  1. 平衡条件转化
    平衡子矩形要求黑格和白格数量相等,等价于黑格数 - 白格数 = 0。我们可以将黑格(1)记为+1,白格(0)记为-1,问题转化为寻找和为0的最大子矩形。
  2. 降维处理
    通过固定上下边界,将每列的和压缩成一维数组,问题进一步转化为寻找一维数组中和为0的最长子数组(经典的前缀和+哈希表问题)。
GESP:2024年6月 C++四级 真题及解析 第33张
GESP:2024年6月 C++四级 真题及解析 第34张

GESP 2024年6月 C++四级 宝箱

#include<iostream>#include<algorithm>#include<vector>using namespace std;intcasebag(int n, int k, vector<int>& A){    int i = 0;          // 窗口左指针    int ans = 0;        // 当前窗口的和    int max_sum = 0;    // 记录最大和    for (int j = 0; j < n; j++) {  // 右指针j逐步扩展窗口        ans += A[j];               // 将A[j]加入当前窗口        // 维护窗口极差约束:A[j]-A[i] <=k        while (A[j] - A[i] > k) {  // 极差超过k时缩小窗口            ans -= A[i];           // 从和中移除A[i]            i++;                   // 左指针右移        }        // 更新最大和        if (max_sum < ans) {            max_sum = ans;        }    }    return max_sum;}intmain(){    int n, k;    cin >> n >> k;    vector<intA(n);    for (int i = 0; i < n; i++) {        cin >> A[i];    }    sort(A.begin(), A.end());      // 关键排序操作    int ans = casebag(n, k, A);    cout << ans << endl;    return 0;}
GESP:2024年6月 C++四级 真题及解析 第35张

课程体系——

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

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

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

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

喜欢您关注我们哦——

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