GESP 四级真题完整题单分析
题目编号 | 完整题目标题 | 难度 | 考点解析 | 解题思路 |
---|---|---|---|---|
B3939 | [GESP样题 四级] 绝对素数 | 普及− | 素数判断、数位交换 | 1. 枚举10-99的两位数 2. 交换十位和个位 3. 验证原数和交换数均为素数 |
B3940 | [GESP样题 四级] 填幻方 | 普及− | 模拟填数、边界处理 | 1. 从第一行中间开始填数 2. 右上角有数则下方填数 3. 边界用取模实现回绕 |
B3850 | [GESP202306 四级] 幸运数 | 普及− | 数位分解、进制转换 | 1. 计算十进制各位和 2. 转二进制统计1的数量 3. 比较两和是否相等 |
B3851 | [GESP202306 四级] 图像压缩 | 普及/提高− | 二维数组、游程编码 | 1. 按行扫描像素矩阵 2. 统计连续相同值 3. 存储(值,长度)压缩对 |
B3869 | [GESP202309 四级] 进制转换 | 普及− | 进制转换算法 | 1. 循环除k取余 2. 余数映射为字符(10→’A’) 3. 反向拼接结果字符串 |
B3870 | [GESP202309 四级] 变长编码 | 普及− | 哈夫曼编码、频率统计 | 1. 统计字符频率 2. 手动建哈夫曼树 3. 递归生成编码 4. 输出编码串 |
B3927 | [GESP202312 四级] 小杨的字典 | 普及− | 字符串排序、二分查找 | 1. 冒泡排序单词字典序 2. 对每个查询单词二分查找 3. 输出位置 |
B3928 | [GESP202312 四级] 田忌赛马 | 普及− | 贪心策略、双指针 | 1. 升序排序双方马速 2. 田忌用最慢消耗王最快 3. 用最快赢王最快 4. 统计胜场 |
B3958 | [GESP202403 四级] 相似字符串 | 普及− | 字符串匹配、差异统计 | 1. 遍历两个字符串 2. 统计相同位置不同字符数 3. 差异≤阈值输出"Yes" |
B3959 | [GESP202403 四级] 做题 | 普及− | 结构体排序、贪心选择 | 1. 按分值/耗时比降序排序 2. 从高到低选题直到时间用完 |
B4005 | [GESP202406 四级] 黑白方块 | 普及− | 前缀和、矩阵统计 | 1. 计算行列前缀和 2. 枚举子矩阵验证黑白块平衡 3. 统计合格子矩阵 |
B4006 | [GESP202406 四级] 宝箱 | 普及− | 双指针、区间维护 | 1. 按位置排序宝箱 2. 双指针维护价值差≤k的区间 3. 记录最大区间 |
B4040 | [GESP202409 四级] 黑白方块 | 普及− | 同 B4005(不同数据) | 同 B4005 |
B4041 | [GESP202409 四级] 区间排序 | 普及− | 自定义排序、区间合并 | 1. 按左端点排序 2. 合并重叠区间 3. 按长度降序输出 |
B4068 | [GESP202412 四级] Recamán | 普及− | 数组标记、序列生成 | 1. 标记已出现数字 2. 生成规则: - 优先取a[n-1]-n(>0且未出现) - 否则取a[n-1]+n |
B4069 | [GESP202412 四级] 字符排序 | 普及− | 拓扑排序、依赖关系 | 1. 构建邻接矩阵 2. 统计节点入度 3. 队列处理入度0节点 4. 输出拓扑序 |
B4263 | [GESP202503 四级] 荒地开垦 | 普及− | 网格遍历、邻居统计 | 1. 统计荒地周围杂物数 2. 清除杂物后更新邻居状态 3. 循环直到无新开垦 |
B4264 | [GESP202503 四级] 二阶矩阵 | 入门 | 矩阵乘法、公式推导 | 1. 手动实现2×2矩阵乘法 2. 循环计算矩阵幂 3. 输出指定位置值 |
B4360 | [GESP202506 四级] 画布裁剪 | 入门 | 几何计算、面积比例 | 1. 计算原始面积 2. 减去裁剪区域 3. 输出剩余面积比例 |
B4361 | [GESP202506 四级] 排序 | 普及− | 稳定排序、多关键字处理 | 1. 先按次关键字稳定排序 2. 再按主关键字稳定排序 3. 输出最终序列 |
四级核心考点分布统计
考点类别 | 覆盖题数 | 高频题型 | 关键实现方法 |
---|---|---|---|
字符串处理 | 7题 | 字典查询、相似字符串、编码 | 字符数组操作、手动二分查找 |
排序算法 | 6题 | 田忌赛马、做题、字符排序 | 冒泡排序、多关键字排序 |
矩阵/网格处理 | 5题 | 图像压缩、黑白方块、荒地开垦 | 二维数组遍历、前缀和计算 |
贪心策略 | 4题 | 田忌赛马、做题、区间排序 | 双指针、最优选择策略 |
数学计算 | 4题 | 进制转换、绝对素数、二阶矩阵 | 模运算、素数判断、矩阵乘法 |
特殊数据结构 | 3题 | 变长编码、字符排序、Recamán | 哈夫曼树、拓扑排序、数组标记 |
四级必备代码模板
1. 冒泡排序(多关键字)
struct Node {
int mainKey; // 主关键字
int subKey; // 次关键字
};
void bubbleSort(Node arr[], int n) {
for(int i=0; i<n-1; i++) {
for(int j=0; j<n-i-1; j++) {
// 先按次关键字排序
if(arr[j].subKey > arr[j+1].subKey) {
swap(arr[j], arr[j+1]);
}
}
}
for(int i=0; i<n-1; i++) {
for(int j=0; j<n-i-1; j++) {
// 再按主关键字稳定排序
if(arr[j].mainKey > arr[j+1].mainKey) {
swap(arr[j], arr[j+1]);
}
}
}
}
2. 拓扑排序(字符依赖)
const int MAX = 26;
int graph[MAX][MAX]; // 邻接矩阵
int indegree[MAX]; // 入度数组
void topoSort() {
queue<int> q;
// 初始化队列
for(int i=0; i<MAX; i++) {
if(indegree[i] == 0) q.push(i);
}
while(!q.empty()) {
int cur = q.front();
q.pop();
cout << char('A'+cur);
for(int i=0; i<MAX; i++) {
if(graph[cur][i]) {
indegree[i]--;
if(indegree[i] == 0) {
q.push(i);
}
}
}
}
}
3. 双指针(宝箱问题)
int maxTreasures(int values[], int n, int k) {
// 先排序价值数组
bubbleSort(values, n);
int left = 0, maxLen = 0;
for(int right=0; right<n; right++) {
// 调整左指针直到差值≤k
while(values[right] - values[left] > k) {
left++;
}
// 更新最大区间
maxLen = max(maxLen, right - left + 1);
}
return maxLen;
}
4. 幻方填充(取模回绕)
void fillMagicSquare(int n) {
int grid[15][15] = {0};
int i = 0, j = n/2;
for(int num=1; num<=n*n; num++) {
grid[i][j] = num;
// 计算下一个位置
int ni = (i-1+n) % n;
int nj = (j+1) % n;
// 目标位置已填充则下方填数
if(grid[ni][nj] != 0) {
i = (i+1) % n;
} else {
i = ni;
j = nj;
}
}
}
易错点及解决方案
-
数组越界(出现率80%)
- 场景:矩阵操作、字符串处理
- 方案:数组声明增加冗余空间
int arr[105]
(实际需求100)
-
边界条件错误(出现率70%)
- 场景:双指针、循环遍历
- 方案:测试边界数据(空数组、单元素、最大值)
-
排序稳定性处理(出现率40%)
- 场景:多关键字排序
- 方案:使用稳定排序(冒泡),先排次关键字再排主关键字
-
死循环风险(出现率30%)
- 场景:BFS、递归
- 方案:设置最大递归深度/循环次数