版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年3月GESP编程能力等级认证C++六级真题(含答案和解析)一、单选题(每题2分,共30分)。1.下列关于C++中类的描述,正确的是()。A.如果类没有用户声明的构造函数,那么编译器会隐式声明一个默认构造函数。B.类的析构函数可以被重载,一个类可以有多个析构函数。C.类中的所有成员都必须声明为publicD.类和结构体在C++中没有区别,包括默认访问权限也相同。答案:A。解析:若类中没有用户声明的构造函数,编译器会隐式声明一个默认构造函数,因此A正确。析构函数不能重载,一个类只能有一个析构函数;类成员可以是public、private或protected;class和struct的主要区别之一是默认访问权限不同:class默认private,struct默认public。2.下列代码中,s1->draw();和s2->draw();输出不同结果的主要原因是()。classShape{public:virtualvoiddraw(){cout<<"绘制图形"<<endl;}virtual~Shape(){}};classCircle:publicShape{public:voiddraw()override{cout<<"绘制圆形"<<endl;}};classRectangle:publicShape{public:voiddraw()override{cout<<"绘制矩形"<<endl;}};intmain(){Shape*s1=newCircle();Shape*s2=newRectangle();s1->draw();s2->draw();deletes1;deletes2;return0;}A.draw()是普通成员函数B.Shape中的draw()被声明为虚函数C.Circle和Rectangle中使用了public继承D.指针变量名不同答案:B。解析:基类Shape中的draw()被声明为virtual,派生类对其进行了重写。通过基类指针调用draw()时,会根据对象的实际类型在运行时决定调用Circle还是Rectangle类,这正是多态产生的关键原因。3.下面的代码在main()中有一行会导致编译错误,请找出来。()。classPet{public:Pet(stringn,inta):name(n),age(a){}stringgetName(){returnname;}voidbirthday(){age++;}private:stringname;intage;};intmain(){Petcat("奶茶",2);cout<<cat.getName();//①。cat.birthday();//②。="大橘";//③。cout<<cat.getName();//④。}A.第①行B.第②行C.第③行D.第④行答案:C。解析:name被声明在private访问区,只能在类的成员函数内部访问,不能在main()中直接写="大橘";第①、②、④行调用的是public成员函数,因此不会因为访问权限而报错。4.游乐园的过山车每次限坐4人,用循环队列管理排队(容量MAX=5,空一格判满)。下面代码执行后,循环队列是否已满?rear的值是多少?()。constintMAX=5;intqueue[MAX];intfront=0,rear=0;//入队。voidenqueue(intx){queue[rear]=x;rear=(rear+1)%MAX;}//出队。voiddequeue(){front=(front+1)%MAX;}intmain(){enqueue(1);enqueue(2);enqueue(3);enqueue(4);dequeue();dequeue();enqueue(5);enqueue(6);}A.已满,rear=1。B.未满,rear=1。C.已满,rear=2。D.未满,rear=4。答案:A。解析:初始front=0,rear=0。入队4次后rear依次变为1、2、3、4;出队2次后front变为2;再入队5后rear变为0,入队6后rear变为1。此时front=2,rear=1,满足(rear+1)%MAX=front,即(1+1)%5=2,所以队列已满。5.在以下计算机系统应用场景中,最适合使用循环队列的是()。A.函数调用过程中,保存局部变量和返回地址。B.表达式求值中的运算符优先级处理C.操作系统中的进程优先级调度(高优先级先执行)D.生产者和消费者问题中的共享缓冲区答案:D。解析:循环队列非常适合固定容量、反复入队出队的缓冲区场景,例如生产者-消费者模型中的共享缓冲区。A和B常用栈处理;C更适合优先队列,而不是普通循环队列。6.在二叉搜索树(BST)中,若中序遍历的序列为{1,2,3,4,5},且先序遍历的第一个序列元素为3,则下列说法正确的是()。A.该树一定是一棵完全二叉树。B.元素4和5不可能是兄弟节点。C.元素1所在节点的深度可能大于3(根节点深度为1)。D.元素2一定是元素1的父节点。答案:B。解析:先序第一个元素为3,说明根节点是3;由中序序列可知左子树是{1,2},右子树是{4,5}。右子树只有两个结点,必然是一个根加一个孩子,因此4和5不可能同为某个节点的左右孩子,所以不可能是兄弟节点。A、C、D都不一定成立。7.某二叉树共有10个结点,记为A~J,已知它的先序遍历序列为:ABDHIECFJG,中序遍历序列为:HDIBEAFJCG,则该二叉树的后序遍历序列是()。A.HIDEBJFGCAB.HIDBEJFGCAC.IHDEBJFGCAD.HIDEBFJGCA答案:A。解析:由先序可知根为A;结合中序序列可把整棵树拆成左、右子树,再递归还原结构。最终得到左子树后序为HIDEB,右子树后序为JFGC,整棵树的后序遍历为HIDEBJFGCA。8.下列关于树的遍历的说法中,正确的一项是()。A.对任意一棵树进行深度优先遍历,所得序列一定唯一。B.已知一棵二叉树的先序遍历和后序遍历序列,可以唯一确定这棵二叉树。C.已知一棵二叉树的先序遍历和中序遍历序列,可以唯一确定这棵二叉树。D.已知一棵二叉树的先序遍历序列,可以唯一确定这棵二叉树。答案:C。解析:先序遍历给出根结点顺序,中序遍历给出左右子树的划分,两者结合可以唯一确定一棵二叉树。仅有先序与后序时一般不能唯一确定;仅有先序更不能唯一确定。9.有6个字符,它们出现的次数分别为:{2,3,3,4,6,8},现在用哈夫曼编码为这些字符编码,最小加权路径长度WPL(每个字符的出现次数×它的编码长度,再把每个字符结果加起来)的值为()。A.58B.60C.62D.64答案:D。解析:按哈夫曼构造过程依次合并最小的两个权值:2+3=5,3+4=7,5+6=11,7+8=15,11+15=26。哈夫曼树的最小加权路径长度等于每次合并权值之和,因此WPL=5+7+11+15+26=64。10.对n个不同符号进行哈夫曼编码。若生成的哈夫曼树共有115个结点,则n的值是()。A.60B.58C.57D.56答案:B。解析:哈夫曼树是一棵满二叉树,若有n个叶子结点,则总结点数为2n-1。由2n-1=115得n=58。11.关于格雷编码(GrayCode),下列说法正确的是()。A.格雷编码中,编码位数越多,相邻编码之间变化的位数也越多。B.格雷编码中,相邻两个编码的二进制位恰好有一位不同。C.格雷编码就是把普通二进制编码按位取反后得到的结果D.格雷编码不能用于数字电路和状态转换的设计中答案:B。解析:格雷编码的核心性质是相邻两个编码恰好只有1位不同。12.给定一棵二叉树,采用广度优先搜索(BFS)算法,返回右视图所有节点的值。其中右视图定义为:二叉树的右视图是从树的右侧看过去时可见的节点集合,即右视图中的每个节点都是某一层中最右侧的节点。()。structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};vector<int>rightSideView(TreeNode*root){unordered_map<int,int>rightmostValueAtDepth;intmax_depth=-1;queue<TreeNode*>nodeQueue;queue<int>depthQueue;nodeQueue.push(root);depthQueue.push(0);while(!nodeQueue.empty()){TreeNode*node=nodeQueue.front();nodeQueue.pop();intdepth=depthQueue.front();depthQueue.pop();if(node!=NULL){max_depth=max(max_depth,depth);rightmostValueAtDepth[depth]=node->val;nodeQueue.push(node->left);nodeQueue.push(node->right);depthQueue.push(________);depthQueue.push(________);}}vector<int>rightView;for(intdepth=0;________;++depth){rightView.push_back(rightmostValueAtDepth[depth]);}returnrightView;};A.depthdepthdepth<max_depthB.depth+1depth+1depth<=max_depthC.depth+1depth+1depth<max_depthD.depthdepthdepth<=max_depth答案:B。解析:左右孩子都位于当前结点的下一层,因此两个入队的深度都应为depth+1。最终收集答案时,深度从0一直到max_depth,都要被遍历到,所以循环条件应为depth<=max_depth。13.下列关于树的深度优先搜索(DFS)的说法中,正确的是()。A.对树进行DFS时,一定是按层从上到下依次访问结点。B.对任意一棵树进行DFS,得到的遍历序列唯一。C.对一棵树进行DFS时,常借助递归或栈实现。D.DFS只能用于二叉树,不能用于普通树。答案:C。解析:DFS的实现方式通常有两种:递归或栈。A描述的是BFS的特点;B不正确,因为访问孩子的先后顺序不同,DFS序列也可能不同;D也不正确,DFS同样适用于普通树和图。14.小朋友们去邻里拜年,每个家里有不同数量的糖果。规则是:不能连续进入两个相邻的房子(即不能同时取相邻两家的糖果)。目标是拿到最多糖果。以下是代码实现,请补全横线。()。intvisit(vector<int>&nums){if(nums.empty()){return0;}intsize=nums.size();if(size==1){returnnums[0];}vector<int>dp=vector<int>(size,0);dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);for(inti=2;i<size;i++){dp[i]=______;//在此处填写代码。}returndp[size-1];}A.dp[i]=dp[i-1]+nums[i];B.dp[i]=max(dp[i-1],dp[i-2]*nums[i]);C.dp[i]=max(dp[i-1],dp[i-2]+nums[i]);D.dp[i]=dp[i-2]+nums[i];答案:C。解析:设dp[i]表示考虑前i个房子时能拿到的最多糖果。到第i个房子时有两种选择:不拿它,则答案是dp[i-1];拿它,则上一个房子不能拿,答案是dp[i-2]+nums[i]。因此转移为dp[i]=max(dp[i-1],dp[i-2]+nums[i])。15.元宵节晚上,小朋友沿着一条发光石板路前进,每次可向前走1块或2块石板。动态规划定义如下:dp[i]=dp[i-1]+dp[i-2],下面关于dp[i]的含义最合适的是()。A.走到第i块石板的不同走法数量B.走到第i块石板时,已经走过的石板总数。C.从第i块石板走回起点的最少步数D.从第i块石板走回起点的最大步数答案:A。解析:若每次只能走1步或2步,则到达第i块石板的方案数等于“先到第i-1块再走1步”的方案数与“先到第i-2块再走2步”的方案数之和,因此dp[i]表示到达第i块石板的不同走法数量。二、判断题(每题2分,共20分)。16.下面定义了一个表示二维坐标点的类Point,并提供了一个带参数的构造函数,但第②行Pointb;会调用编译器自动生成的默认构造函数,将b.x和b.y初始化为0.0,程序可以正常编译运行。()。classPoint{public:doublex,y;Point(doublepx,doublepy):x(px),y(py){}voidprint(){cout<<"("<<x<<","<<y<<")";}};intmain(){Pointa(3.0,4.0);//①。Pointb;//②。a.print();}答案:错误。解析:一旦类中已经声明了带参数构造函数,编译器就不会再自动生成无参默认构造函数。代码中的Pointb;需要调用无参构造函数,但类中没有提供,所以程序会编译失败,更不会把b.x和b.y自动初始化为0.0。17.题C++中的继承支持单继承和多继承,但子类无法直接访问父类的私有成员。()。答案:正确。解析:C++既支持单继承,也支持多继承。父类的private成员属于封装内容,子类对象不能直接访问,只能通过父类提供的公有或受保护接口间接使用。18.对如下结构的树,执行travel函数,输出结果是12345。()。structNode{intval;Node*left,*right;Node(intv):val(v),left(nullptr),right(nullptr){}};voidtravel(Node*root){if(!root)return;stack<Node*>s;s.push(root);while(!s.empty()){Node*cur=s.top();s.pop();cout<<cur->val<<"";if(cur->right)s.push(cur->right);if(cur->left)s.push(cur->left);}}答案:错误。解析:栈是后进先出。代码先压右孩子、再压左孩子,所以左孩子会先弹出,遍历顺序为“根-左-右”,即12453,而不是12345。19.若所有字符出现频率相同,则哈夫曼编码一定会得到完全二叉树。()。答案:错误。解析:频率相同只能说明合并时有多种合法选择,但不能保证构造出来的哈夫曼树一定是完全二叉树。哈夫曼树一定是满二叉树(内部结点都有两个孩子),但不一定满足完全二叉树的层次结构要求。20.哈夫曼编码是一种变长的前缀编码,在解码时不需要额外的分隔符就能唯一还原,这是因为在哈夫曼树中,任何一个字符的叶子结点都不会成为另一个字符结点的祖先。()。答案:正确。解析:哈夫曼编码满足“任一码字都不是另一码字的前缀”。在树上看,所有字符对应叶子结点,叶子不可能成为其他叶子的祖先,因此编码串可以从前到后唯一划分和解码。21.在C++中使用一维数组vector<int>tree存储按层序遍历的完全二叉树时,若根节点存储在tree[0],则对于任意非空节点tree[i],其右孩子(如果存在)必然位于tree[2*i+2]。()。答案:正确。解析:完全二叉树按层序从0开始存储时,结点i的左孩子下标是2*i+1,右孩子下标是2*i+2。这是顺序存储完全二叉树的基本性质。22.在C++中使用栈来非递归地实现二叉树的前序遍历时,为了保证遍历顺序正确,在处理完当前结点后,应该先将该结点的左孩子压入栈中,然后再将右孩子压入栈中。()。答案:错误。解析:前序遍历顺序是“根-左-右”。由于栈后进先出,想让左孩子先被处理,就必须先压入右孩子,再压入左孩子;若先压左再压右,则右孩子会先出栈,顺序就错了。23.设二叉树共有n个结点,函数preorderTraversal以下代码的时间复杂度为O(n),空间复杂度为O(n)。()。structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};voidpreorder(TreeNode*root,vector<int>&res){if(root==nullptr){return;}res.push_back(root->val);preorder(root->left,res);preorder(root->right,res);}vector<int>preorderTraversal(TreeNode*root){vector<int>res;preorder(root,res);returnres;};答案:正确。解析:每个结点只会被访问一次,因此时间复杂度为O(n)。空间方面,结果数组res需要保存n个结点值,递归栈最坏也可达到O(n),所以整体写成O(n)是正确的。24.下列代码实现了一个0-1背包的一维动态规划代码,内层循环是经典的逆序写法。若将内层循环改成正序遍历(即for(intj=w[i];j<=W;j++)),仍能得到正确答案。()。intmain(){intW=5;intw[]={2,3,4};intv[]={10,1,1};intn=3;intdp[6]={0};for(inti=0;i<n;i++){for(intj=W;j>=w[i];j--){//←逆序!dp[j]=max(dp[j],dp[j-w[i]]+v[i]);}}cout<<dp[W];}答案:错误。解析:0/1背包要求每件物品最多使用一次,因此一维优化时容量j必须逆序遍历。若改成正序,dp[j-w[i]]可能已经包含当前物品,等价于允许同一件物品被重复选取,会把问题错误地变成完全背包。25.在动态规划问题中,状态空间相同且没有重复计算的情况下,“状态转移方程+递推”与“递归+记忆化搜索”的时间复杂度通常相同。()。答案:正确。解析:当两种写法访问到的状态集合相同、且每个状态只计算一次时,它们完成的状态转移总次数通常一致,因此时间复杂度通常相同。差别主要体现在实现形式、常数开销和调用栈使用上。三、编程题(每题25分,共50分)。26.试题名称:选数。时间限制:1.0s。内存限制:512.0MB。题目描述:给定两个包含n个整数的数组a=[a1,…,an]与b=[b1,…,bn]。你需要指定若干下标p1<…<pk(1≤k≤n)使得以下条件成立。(1)1≤pi≤n(1≤i≤k)。(2)pi+1≥pi+bpi≤n(1≤i≤k)。你需要在满足以上条件的前提下最大化也即最大化数组a对应下标的整数之和。输入格式。第一行,一个正整数n,表示数组长度。第二行,n个正整数a1,…,an,表示数组a。第三行,n个正整数b1,…,bn,表示数组b。输出格式:一行,一个整数,表示在满足下标条件的前提下,数组a对应下标的整数之和的最大值。输入样例1。输出样例1。输入样例2。输出样例2。数据范围。对于40%的测试点,保证2≤n≤103。对于所有测试点,保证2≤n≤105,0≤ai≤109,0≤bi≤n。参考程序。#include<cstdio>#include<algorithm>usingnamespacestd;constintN=1e5+5;intn;inta[N],b[N];longlongf[N],ans;intmain(){scanf("%d",&n);for(inti=1;i<=n;i++)scanf("%d",&a[i]);for(inti=1;i<=n;i++)scanf("%d",&b[i]);for(inti=1;i<=n;i++){ans=max(ans,f[i]+a[i]);if(i+b[i]<=n)f[i+b[i]]=max(f[i+b[i]],f[i]+a[i]);f[i+1]=max(f[i+1],f[i]);}printf("%lld\n",ans);return0;}解析:(1)状态定义:设f[i]表示“处理到位置i时,当前能够从位置i继续决策”时的最大收益。(2)跳过当前位置:如果不选i,那么可以直接转移到下一位置,f[i+1]=max(f[i+1],f[i])。(3)选择当前位置:如果选i,则先把a[i]加入答案,之后下一个允许继续选择的位置至少是i+b[i],于是可转移到f[i+b[i]]。(4)答案更新:在扫描到位置i时,f[i]+a[i]就表示“最后一个选择是i”的一种合法方案,因此用它更新全局最大值。(5)复杂度分析:每个位置只做常数次转移,总时间复杂度O(n),空间复杂度O(n)。27.试题名称:完全二叉树。时间限制:1.0s。内存限制:512.0MB。题目描述:给定一棵包含n个结点的有根二叉树,结点依次以1,2,…,n编号,根结点编号为1。对于结点i,其左儿子的编号记为li,右儿子编号记为ri。特别地,如果左儿子不存在则li=0,如果右儿子不存在则ri=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年黑龙江省穆棱市高二化学下册期末考试模拟检测卷【完整版】附答案
- 2026年广东省开平市高二化学下册期末考试模拟卷附答案(考试直接用)
- 2026年浙江省龙泉市高二化学下册期末考试模拟测试卷及答案(新)
- 2026年青海省德令哈市高二化学下册期末考试模拟测试卷及参考答案【研优卷】
- 2026年陕西省韩城市高二化学下册期末考试模拟试卷附答案(综合卷)
- 2026年广东省高州市高二化学下册期末考试模拟检测卷及参考答案【培优A卷】
- 2026年河南省长葛市高二化学下册期末考试模拟测试卷及完整答案一套
- 2026年山西省介休市高二化学下册期末考试模拟试卷附参考答案(研优卷)
- 2026年广东省普宁市高二化学下册期末考试模拟测试卷附参考答案(预热题)
- 2026年云南省香格里拉市高二化学下册期末考试模拟考试卷(考点提分)附答案
- 2026江苏连云港市城建控股集团有限公司招聘32人笔试参考题库及答案详解
- 2026年辽宁锦州海通实业有限公司计划招录28人备考题库及答案详解参考
- 2026年西安工业大学招聘备考题库(14人)含答案详解
- 2026青海数字经济发展集团有限公司社会招聘9人笔试参考题库及答案详解
- 电梯安全性能验收标准
- 2026福建中考语文作文考前专项练习(题目+范文)
- 2024-2025学年上海市黄浦区七年级(下)期末数学试卷(含解析)
- 2026年安徽省体育彩票管理中心编外聘用人员公开招聘11名考试参考题库及答案解析
- 2026年《中华民族共同体概论》第13讲先锋队与中华民族独立解放(1919-1949)新版课件
- 江西文演集团招聘笔试题库2026
- 2026年江西高考化学题库及答案
评论
0/150
提交评论