视频讲解:GESP2026年3月五级C++真题讲解
一、单选题
第1题
解析:
答案D,
A:需要找到前驱结点,才能删除 B:没有头结点时,存在空指针 C:循环双链表,尾结点的next指向头结点第2题
解析:
答案C,只有C选项符合
第3题
解析:
答案B,要删除x结点,就是x前驱结点 指向 x后驱结点,即cur->next = del->next
第4题
解析:
答案A,
模拟辗转相除法过程 48/18=2...12 18/12=1...6 12/6=2...0 6/0第5题
解析:
答案C,for循环primes动态数组,即从0下标 至 primes的size
第6题
解析:
答案C,
is_compostie数组情况 下标:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 数值:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 假设n为15 i为2时 下标:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 数值:0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 i为3时,从3*3=9开始标记,6已经被2的倍数标记过了 下标:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 数值:0 0 0 1 0 1 0 1 1 1 0 1 1 1 1第7题
解析:
答案B
二分答案在查找数组中,至少k个数据,每个数据之间之间的最大值 数组:1 2 4 8 9 1 4 9,3>=k,差距最大为3第8题
解析:
答案A,当>x时,保留当前数据,试着往更小去找,所以mid需要保留,即r=mid
第9题
解析:
答案D,栈溢出,程序就无法正常运行了
第10题
解析:
答案A,
check(mid)符合条件时,往更大去尝试,即l=mid+1 check(mid)不符合条件时,往更小去尝试,即r=mid-1第11题
解析:
答案B,循环n次,递归logn次,即nlogn
第12题
解析:
答案B,从小到大排序,小的先入队,A想要入队,即A[i]<=B[j]
第13题
解析:
答案C,快排最坏的情况是n²
第14题
解析:
答案B,只有选择排序、快速排序、希尔排序、堆排序是稳定的
第15题
解析:
答案B,rem代表余数,即rem%=b
二、判断题
第1题
解析:
答案√,
数组访问为O(1),插入元素为O(n) 单链表访问为O(n),插入结点为O(1)第2题
解析:
答案√,
if( a[mid] >= x ) r = mid; 当 >=x,保留当前答案,往更小去二分查找第3题
解析:
答案×,
8(a) 3 8(b) 4 9 2 1 中间值为4时: 2 3 1 4 9 8(a) 6 8(b) 只看4的右边:9 8(a) 8(b) 中间值为8(a)时: 8(b) 8(a) 9 8(a) 3 8(b)的相对位置发送改变了第4题
解析:
答案√,递归函数T(n/2),即复杂度为logn,每次递归O(n),即 n logn
第5题
解析:
答案×,只计算了一次的归并排序逆序对,没有用归并排序计算全部的
第6题
解析:
答案√,
例如12=2*2*3,分解质因数,只有唯一的情况 罗列36的因数 1 2 3 4 6 9 12 18 36 发现因数成对出现,(1,36) (2,18) (3,12) (4,9),只有平方根6特殊 小因数为:1 2 3 4;大因数:9 12 18 36 只需要找小因数,没必要找大因数,即小因数的范围1<x && x<sqrt(36)第7题
解析:
答案√,
第8题
解析:
答案×,以下硬币选取案例,贪心有最优子结构,但是没有重叠子结构,计算出最优解
第9题
解析:
答案×,是被最小的质因子筛去
假设所有都是质数,除了1 数字:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 标记:1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 i从2开始循环 i为2时,出现质数:2。2*2=4标记不是质数 数字:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 标记:1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 i为3时,出现质数:2 3。3*2=6、3*3=9标记不是质数 数字:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 标记:1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 i为4时,出现质数:2 3。2*4=8标记不是质数 ,4*3没必要标记,等等6*2会标记 所以【以最小质因子筛选】 数字:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 标记:1 0 0 1 0 1 0 0 1 0 0 0 0 0 0第10题
解析:
答案×,任何递归都可以改写非递归,但是改写后不再需要栈
//递归 int fib(int n) { if (n <= 1) return n; return fib(n-1) + fib(n-2); } //改写while int fib(int n) { if (n <= 1) return n; int a = 0, b = 1, i = 2; while (i <= n) { int c = a + b; a = b; b = c; i++; } return b; } //改写for int fib(int n) { if (n <= 1) return n; int a = 0, b = 1; for (int i = 2; i <= n; i++) { int c = a + b; a = b; b = c; } return b; }三、编程题
第1题 [GESP202603 五级] 有限不循环小数
题目描述
若 a1 可化为一个有限的,不循环的小数,则称 a 为终止数。
请你求出在 L 到 R 中终止数的数量。
输入格式
输入一行,包含两个整数 L,R。
输出格式
输出一行,包含一个整数,表示 L 到 R 中终止数的数量。
输入输出样例
输入 #1
2 11输出 #1
5说明/提示
样例解释
在 [2,11] 终止数有 2、4、5、8、10。
数据范围
保证 1≤L≤R≤10^6。
答案
#include<bits/stdc++.h> using namespace std; int main(){ //1)确定范围 int L,R;cin>>L>>R; //2)循环L至R int ans=0; for(int i=L;i<=R;i++){ //3)判断是否为终止数 //只能是2或5的倍数 int copy=i; while(copy%2==0) copy/=2; while(copy%5==0) copy/=5; if(copy==1) ans++; } cout<<ans; return 0; }第2题 [GESP202603 五级] 找数
题目描述
给定一个包含 n 个互不相同的正整数的数组 A 与一个包含 m 个互不相同的正整数的数组 B,请你帮忙计算有多少个数在数组 A 与数组 B 中均出现。
输入格式
第一行包含两个整数 n,m。
第二行包含 n 个正整数 a1,a2,⋯,an 表示数组 A。
第三行包含 m 个正整数 b1,b2,⋯,bm 表示数组 B。
输出格式
输出一个整数,表示在数组 A 与数组 B 中均出现的数的个数。
输入输出样例
输入 #1
3 5 4 2 3 3 1 5 4 6输出 #1
2说明/提示
样例解释
样例 1 中,4、3 在数组 A 与 B 中均出现。
数据范围
对于 40% 的数据,保证 1≤n,m≤1000。
对于 100% 的数据,保证 1≤n,m≤10^5,1≤ai,bi≤10^9。
答案
#include<bits/stdc++.h> using namespace std; map<int,bool> vis; int main(){ //1)填充数据 int n,m; cin>>n>>m; for(int i=1;i<=n;i++){ int a;cin>>a; //2)标记出现 vis[a]=1; } //3)根据vis标记 判断是否重复出现 int ans=0; for(int i=1;i<=m;i++){ int b;cin>>b; if(vis[b]==1) ans++; } cout<<ans; return 0; }