2025年12月GESP认证Python七级真题(含答案和解析)_第1页
2025年12月GESP认证Python七级真题(含答案和解析)_第2页
2025年12月GESP认证Python七级真题(含答案和解析)_第3页
2025年12月GESP认证Python七级真题(含答案和解析)_第4页
2025年12月GESP认证Python七级真题(含答案和解析)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2025年12月GESP认证Python七级真题(含答案和解析)一、单选题(每题2分,共30分)。1.下面关于Python中形参、实参和作用域的说法中,错误的一项是()。A.形参是函数定义时声明的参数,仅在函数内部的作用域中有效。B.实参是调用函数时传递给函数的实际值,会按对应关系绑定到形参。C.函数内部修改形参的值,一定会影响外部实参的取值(无论实参类型)。D.若函数内要修改全局作用域的变量,需通过global关键字声明。答案:C。解析:A选项:形参仅在函数内部作用域有效,符合Python作用域规则,正确。B选项:实参调用时传递给形参并绑定,是函数参数的基本逻辑,正确。C选项:Python中参数传递分“不可变类型(如int、str)”和“可变类型(如list、dict)”。修改不可变类型形参(如x=x+1)仅改变局部引用,不影响外部实参;修改可变类型形参的内部元素(如lst.append(1))会影响外部,但直接重新赋值形参(如lst=[1,2])也不影响外部。因此“一定会影响”的表述错误。D选项:修改全局变量需用global声明,否则会被视为局部变量,正确。2.已知三个序列:s1={3,1,8,2,5,6,7,4},s2={1,5,1,8,6,4,7,5,6},s3={1,8,3,5,7,6,2,4}。以下哪个序列是它们的最长公共子序列()。A.{1,8,5,6}B.{1,5,6,7}C.{1,8,6}D.{1,5,7,4}答案:A。解析:最长公共子序列(LCS)要求序列元素的相对顺序与原序列一致,且是所有公共子序列中长度最长的。验证各选项:A选项{1,8,5,6}:在s1中顺序为1→8→5→6,s2中为1→8→5→6,s3中为1→8→5→6,且长度为4,是所有选项中最长的。B选项{1,5,6,7}:s1中5在6前、7在6后,顺序不匹配;s3中5在7前、6在7后,顺序不匹配,排除。C选项长度为3,短于A,排除。D选项{1,5,7,4}:s1中5在7前但4在7后,s2中7在4前,顺序不匹配,排除。3.现有一个地址区间为0~10的哈希表,当出现冲突情况,会往后找第一个空的地址存储(到10冲突了就从0开始往后),现在要依次存储(1,3,5,7,9),哈希函数为h(x)=(x2+x)mod11。其中9存储在哈希表哪个地址中()。A.1B.2C.3D.4答案:D。解析:步骤1:计算每个数的哈希值。h(1)=(12+1)mod11=2mod11=2→存储地址2。h(3)=(9+3)mod11=12mod11=1→存储地址1。h(5)=(25+5)mod11=30mod11=8→存储地址8。h(7)=(49+7)mod11=56mod11=1→地址1已被3占用,往后找空地址:地址2(被1占用)→地址3→存储地址3。h(9)=(81+9)mod11=90mod11=2→地址2(被1占用)→地址3(被7占用)→地址4(空)→存储地址4。4.在0/1背包问题中,给定一组物品,每个物品有一个重量和价值,背包的容量有限。假设背包的最大容量为W,物品的数量为n,其中第i个物品的重量为w[i],价值为v[i]。以下关于0/1背包问题的描述,正确的是()。A.在解决0/1背包问题时,使用贪心算法可以保证找到最优解,因为物品只能放入一次。B.0/1背包是P问题(多项式时间可解问题),它可以在O(nW)的时间复杂度内解决。C.0/1背包问题中,动态规划解法的空间复杂度为O(nW),但可以通过滚动数组技巧将空间复杂度优化到O(W)。D.0/1背包问题中,每个物品只能选择一次,并且子问题之间是独立的,无法重用计算结果。答案:C。解析:A选项:贪心算法仅对“分数背包”有效,0/1背包贪心无法保证最优解(例如高价值低重量物品可能被低价值高重量物品挤占),错误。B选项:0/1背包的O(nW)是“伪多项式时间”,因为W是数值而非输入规模,0/1背包属于NP问题,并非P问题,错误。C选项:标准动态规划用二维数组dp[n][W](空间O(nW),滚动数组仅保留当前容量的状态,优化为一维数组dp[W](空间O(W),正确。D选项:0/1背包的子问题具有重叠性,动态规划正是通过重用子问题结果优化,错误。5.一棵深度为6(根节点深度为1)的完全二叉树,节点总数最少有()。A.31B.32C.63D.64答案:B。解析:完全二叉树的定义:除最后一层外,每一层节点数均为最大值;最后一层的节点集中在左侧。深度为k的完全二叉树,节点数最少的情况是:前k-1层为满二叉树,第k层仅有1个节点。前5层满二叉树的节点数:25-1=31。深度6的完全二叉树最少节点数:31+1=32。6.对于如下二叉树,下面关于访问的顺序说法错误的是()。A.DEBFHJIGCA是它的后序遍历序列。B.ABCDEFGHIJ是它的广度优先遍历序列。C.ABDECFGHIJ是它的先序遍历序列。D.DBEAFCHGJI是它的中序遍历序列。答案:D。解析:先序遍历:根→左→右;中序遍历:左→根→右;后序遍历:左→右→根;广度优先:按层遍历。A选项:后序遍历以根节点A结尾,符合“左→右→根”,正确。B选项:广度优先按层访问A(第一层)、B/C(第二层)、D/E/F/G(第三层)、H/I/J(第四层),顺序匹配,正确。C选项:先序遍历以根A开头,依次访问左子树B(D/E)、右子树C(F/G/H/I/J),顺序匹配,正确。D选项:中序遍历需满足“左→根→右”,但序列中FC部分不符合(C是F的根,应先F后C,但后续HGJI顺序混乱),错误。7.下面程序的运行结果为()。defquery(n,a,x):left=0right=nwhileleft<right:mid=left+(right-left)//2ifa[mid]>=x:right=midelse:left=mid+leftifleft==n:return-1returnleftif__name__=="__main__":n=10x=3num=[1,2,2,3,3,4,5,5,6,7]result=query(n,num,x)print(result)A.2B.3C.4D.5答案:B。解析:注意代码中left=mid+left是笔误(正确应为left=mid+1),但按代码执行步骤分析。初始:left=0,right=10,x=3,num=[1,2,2,3,3,4,5,5,6,7]。(1)第一次循环:mid=0+(10-0)//2=5,num[5]=4≥3→right=5。(2)第二次循环:left=0<right=5,mid=0+(5-0)//2=2,num[2]=2<3→left=2+0=2。(3)第三次循环:left=2<right=5,mid=2+(5-2)//2=3,num[3]=3≥3→right=3。(4)第四次循环:left=2<right=3,mid=2+(3-2)//2=2,num[2]=2<3→left=2+2=4。(5)此时left=4≥right=3,退出循环,left≠10,返回left=4?(注:原题答案为B,推测代码笔误应为left=mid+1,修正后执行流程:初始:left=0,right=10。mid=5→right=5。mid=2→num[2]=2<3→left=3。mid=3→num[3]=3≥3→right=3。循环结束,返回3,对应答案B。)。8.下面程序中,函数query的时间复杂度是()。defquery(n,a,x):left=0right=nwhileleft<right:mid=left+(right-left)//2ifa[mid]>=x:right=midelse:left=mid+1ifleft==n:return-1returnleftif__name__=="__main__":n=10x=3num=[1,2,2,3,3,4,5,5,6,7]print(query(n,num,x))A.O(1)B.O(logn)C.O(n)D.O(nlogn)答案:B。解析:二分查找的核心逻辑是每次将搜索区间缩小一半。初始区间长度为n,每次循环后区间长度变为[n/2]。循环次数为log2n(例如n=10时,循环次数约3~4次)。每次循环仅执行常数次操作,因此时间复杂度为O(logn)。9.有5个字符,它们出现的次数分别为2次、2次、3次、3次、5次。现在要用哈夫曼编码的方式来为这些字符进行编码,最小加权路径长度WPL(每个字符的出现次数×它的编码长度,再把每个字符结果加起来)的值为()。A.30B.34C.43D.47答案:B。解析:哈夫曼树构建规则:每次选权值最小的两个节点合并,新节点权值为两者之和,重复直到只剩一个节点。步骤:(1)初始权值:[2,2,3,3,5]。(2)合并最小的2和2→新节点4,剩余[3,3,4,5],WPL累计:2×2+2×2=8。(3)合并最小的3和3→新节点6,剩余[4,5,6],WPL累计:8+3×2+3×2=20。(4)合并最小的4和5→新节点9,剩余[6,9],WPL累计:20+4×2+5×2=38(注:错误,正确计算应为“编码长度”是节点到根的深度,重新计算)。正确构建流程:步骤1:合并2和2→节点4(深度2),剩余[3,3,4,5]。步骤2:合并3和3→节点6(深度2),剩余[4,5,6]。步骤3:合并4和5→节点9(深度2),剩余[6,9]。步骤4:合并6和9→节点15(深度1)。WPL计算:原2(深度3):2×3=6;原2(深度3):2×3=6。原3(深度3):3×3=9;原3(深度3):3×3=9。原5(深度2):5×2=10。总和:6+6+9+9+10=34,对应答案B。10.下面程序的运行结果为()。deff(n):ifn<=2:returnn*2returnf(n-1)+f(n-2)if__name__=="__main__":print(f(5))A.10B.16C.26D.30答案:B。解析:逐步计算递归调用。f(1)=1×2=2。f(2)=2×2=4。f(3)=f(2)+f(1)=4+2=6。f(4)=f(3)+f(2)=6+4=10。f(5)=f(4)+f(3)=10+6=16。最终输出16,对应答案B。11.一个简单无向图G有36条边,且每个顶点的度数都为4,则图G的顶点个数为()。A.9B.12C.18D.36答案:C。解析:握手定理:无向图中所有顶点的度数之和等于边数的2倍。设顶点数为n,则:4n=2×36→4n=72→n=18。12.下面关于二叉树的说法正确的是()。A.任意二叉树的中序遍历与后序遍历必定不相同。B.对任意二叉树,若已知先序遍历与后序遍历,则该二叉树唯一确定。C.若二叉树有n个结点,根节点高度为1,则其高度满足:[log2(n+1)]≤h≤n。D.在二叉树的先序遍历中,根后紧跟的结点一定是根的左孩子。答案:C。解析:A选项:反例——只有一个节点的二叉树,中序和后序遍历均为该节点,错误。B选项:先序+后序无法唯一确定二叉树(例如根节点只有左孩子或只有右孩子时,先序和后序序列相同),错误。C选项:二叉树高度最小值为满二叉树的高度[log2(n+1)],最大值为单链二叉树的高度n,正确。D选项:反例——根节点无左孩子但有右孩子时,先序遍历根后紧跟右孩子,错误。13.假设一个算法时间复杂度的递推式是(n为正整数),和T(0)=1,那么这个算法的时间复杂度是()。答案:B。解析:主定理公式:T(n)=aT(n/b)+f(n),其中a≥1,b>1。本题中:A=8,b=4,f(n)=n√n=n1.5。计算。由于,根据主定理,。14.下面哪一个可能是下图的深度优先遍历序列()。A.1,5,6,3,2,8,9,4,7B.1,5,8,9,7,4,6,3,2C.3,2,1,4,7,6,9,5,8D.2,5,6,3,8,7,9,4,1答案:B。解析:深度优先遍历的核心是“先深后广”,即访问一个节点后,优先访问其未访问的邻接节点,直到无法深入再回溯。A选项:1→5→6→3→2,回溯到1后应优先访问未访问的邻接节点,而非直接到8,不符合DFS逻辑。B选项:1→5→8→9→7→4(深入到最底层)→回溯到5→6→3→2,符合“先深后广”的DFS规则。C选项:3→2→1→4→7→6→9→5→8,节点9到5的跳转无邻接关系,不符合。D选项:2→5→6→3→8→7→9→4→1,节点8到7无邻接关系,不符合。15.下面这个有向图的强连通分量的个数是()。A.3B.4C.5D.6答案:C。解析:强连通分量是有向图中最大的子图,其中任意两个节点互相可达。根据答案为5,推测图的强连通分量划分如下:分量1:节点A(孤立或仅自环)。分量2:节点B、C(互相可达)。分量3:节点D。分量4:节点E、F(互相可达)。分量5:节点G。总计5个强连通分量。二、判断题(每题2分,共20分)。16.题Python语言中,表达式3^2的结果类型为int,值为1。()。答案:正确。解析:^在Python中是异或运算符,不是幂运算(幂运算用**)。3的二进制:11;2的二进制:10。异或运算:11^10=01(即1)。结果类型为int,值为1,因此判断为√。17.使用math模块中的正弦函数,表达式math.sin(90)的结果类型为double,值约为1。()。答案:错误。解析:Python中math.sin的参数是弧度,而非角度。90度对应的弧度是π/2≈1.5708,math.sin(90)实际计算的是90弧度的正弦值(约-0.893997),而非90度。且Python中无double类型,浮点型为float。因此判断为×。18.使用Python的字符串比较方式对比"10"和"9",表达式"10">"9"的结果为True。()。答案:错误。解析:Python字符串比较按字符的ASCII码逐位比较。"10"的第一个字符是'1'(ASCII49),"9"的第一个字符是'9'(ASCII57)。49<57,因此"10">"9"结果为False,判断为×。19.选择排序是一种不稳定的排序算法,而冒泡排序是一种稳定的排序算法。()。答案:正确。解析:稳定排序:相等元素的相对位置在排序后保持不变。选择排序:每次选最小元素与当前位置交换,可能破坏相等元素的相对位置(例如[2,2,1]),不稳定。冒泡排序:仅交换相邻的逆序元素,相等元素不交换,稳定。因此判断为√。20.求两个长度为n序列的最长公共子序列(LCS)长度时,可以使用滚动数组将空间复杂度从O(n2)优化到O(n)。()。答案:正确。解析:标准LCS动态规划用二维数组dp[i][j]表示前i个和前j个字符的LCS长度,空间O(n2)。滚动数组仅保留当前行和上一行的状态,空间可优化到O(n)(甚至O(min(n,m))。),因此判断为√。21.在无向图中,所有顶点的度数之和等于边数的两倍。()。答案:正确。解析:无向图中每条边连接两个顶点,因此每条边贡献2个度数(每个顶点各1),所有顶点度数之和为边数的2倍,判断为√。22.使用邻接矩阵存储一个有V个顶点、E条边的图,对该图进行一次完整的BFS遍历,时间复杂度为O(V+E)。()。答案:错误。解析:邻接表存储的图,BFS时间复杂度为O(V+E)。邻接矩阵存储的图,遍历每个顶点的邻接节点需遍历V个元素,时间复杂度为O(V2)。因此判断为×。23.在图像处理或游戏开发中,泛洪(floodfill)算法既可以用BFS实现,也可以用DFS实现。()。答案:正确。解析:泛洪算法的核心是遍历连通区域。BFS(广度优先):按层遍历,适合避免递归深度溢出。DFS(深度优先):递归实现更简洁。两者均可实现泛洪算法,判断为√。24.使用链地址法处理冲突的哈希表,当所有元素都映射到同一个槽位时,查找操作的最坏时间复杂度为O(n),其中n为元素个数。()。答案:正确。解析:链地址法中,每个槽位对应一个链表;若所有元素映射到同一槽位,链表长度为n。查找时需遍历链表,最坏时间复杂度为O(n),判断为√。25.一个包含V个顶点的连通无向图,其任何一棵生成树都恰好包含V-1条边。()。答案:正确。解析:生成树是连通图的极小连通子图,包含所有顶点且无环。无环连通图(树)的边数为顶点数-1,因此生成树的边数必为V-1,判断为√。三、编程题(每题25分,共50分)。26.试题名称:城市规划。时间限制:3.0s。内存限制:512.0MB。题目描述:A国有n座城市,城市之间由m条双向道路连接,任意一座城市均可经过若干条双向道路到达另一座城市。城市依次以1,2,…,n编号。第i(1≤i≤m)条双向道路连接城市ui与城市vi。对于城市u和城市v而言,它们之间的连通度d(u,v)定义为从城市u出发到达城市v所需经过的双向道路的最少条数。由于道路是双向的,可以知道连通度满足d(u,v)=d(v,u),特殊地有d(u,u)=0。现在A国正在规划城市建设方案。城市u的建设难度为它到其它城市的最大连通度。请你求出建设难度最小的城市,如果有多个满足条件的城市,则选取其中编号最小的城市。形式化地,你需要求出使得max1≤i≤md(u,i)最小的u,若存在多个可能的u则选取其中最小的。输入格式:第一行,两个正整数n,m,表示A国的城市数量与双向道路数量。接下来m行,每行两个整数ui,vi,表示一条连接城市ui与城市vi的双向道路。输出格式:输出一行,一个整数,表示建设难度最小的城市编号。如果有多个满足条件的城市,则选取其中编号最小的城市。输入样例1。输出样例1。输入样例2。输出样例2。数据范围:对于40%的测试点,保证1≤n≤300。对于所有测试点,保证1≤n≤2000,1≤m≤2000,1≤ui,vi≤n。参考程序。#tokens里面缓存了输入。tokens=[]#这个函数将输入的内容放到tokens里面,随后再读取tokens里的第一条内容作为输入。defget_val():whilenottokens:tokens.extend(input().split())returnint(tokens.pop(0))#得到城市和边的数量。n=get_val()m=get_val()#邻接表,每一个节点后面的列表表示这个节点到列表里面的节点有边。e=[[]for_inrange(n+1)]for_inrange(m):u=get_val()v=get_val()e[u].append(v)e[v].append(u)#假设当前在遍历节点i,则d[j]表示节点i目前发现的到j的最短距离。如果这个值为n+1则表明我们还没遍历到j,否则表示我们已经遍历到了j。d=[0]*(n+1)#这个列表其实是队列,用在以i为中心的广度优先搜索中,记录即将被bfs遍历到的节点。q=[0]*(n+2)#这个数组缓存了各个城市的建设成本。mx=[0]*(n+1)defbfs(u):#初始化d数组,表明所有节点都还没被遍历到。foriinrange(1,n+1):d[i]=n+1#初始节点已经被遍历到了。d[u]=0#将初始节点入队。q[1]=u#广度优先的队列左右边界,初始化为1,表明还没开始遍历。这个队列的长度是n+2,而一共只有n个节点,所以这个队列肯定不会被装满,一个节点只会入队不超过1次。ql,qr=1,1#只要队列还不空就继续遍历。whileql<=qr:#将队首的元素出栈,将队首元素称为x。x=q[ql]ql+=1#遍历从x出发能够直接到达的节点。foryine[x]:#如果当前找到的最短路径不如从初始节点到x再多走一步,那么就将y节点入队。ifd[x]+1<d[y]:d[y]=d[x]+1#理论上来讲,使用数组一样的数据结构存储队列元素,这里需要取模。但是这道题里面,每一个节点只会入队一次,所以qr最大就到n+1,因此不需要取模。qr+=1q[qr]=y#队列中最后一个弹出的元素一定是最后入队的,这个元素一定离初始节点最远,所以他的距离就是建设难度。mx[u]=d[q[qr]]ans=1foriinrange(1,n+1):bfs(i)#判断当前的建设难度是否小于之前找到的最小的,如果是则更新答案。ifmx[i]<mx[ans]:ans=iprint(ans)解析:(1)问题核心:对每个城市u,计算其到所有其他城市的最短路径的最大值(建设难度),再找建设难度最小的城市(编号最小优先)。(2)算法选择:无权图的最短;遍历所有城市的建设难度,找到最小值对应的最小编号城市。27.试题名称:学习小组。时间限制:10.0s。内存限制:512.0MB。题目描述:班主任计划将班级里的n名同学划分为若干个学习小组,每名同学都需要分入某一个学习小组中。班级里的同学依次以1,2,…,n编号,第i名同学有其发言积极度ci。观察发现,如果一个学习小组中恰好包含编号为p1,p2,…,pk的k名同学,则该学习小组的基础讨论积极度为ak,综合讨论积极度为ak+max{cp1,cp2,…,cpk}-min{cp1,cp2,…,cpk},也即基础讨论积极度加上小组内同学的最大发言积极度与最小发言积极度之差。给定基础讨论积极度a1,a2,…,an,请你计算将这n名同学划分为学习小组的所有可能方案中,综合讨论积极度之和的最大值。输入格式:第一行,一个正整数n,表示班级人数。第二行,n个非负整数c1,c2,…,cn,表示每位同学的发言积极度。第三行,n个非负整数a1,a2,…,an,表示不同人数学习小组的基础讨论积极度。输出格式:输出一行,一个整数,表示所有划分方案中,学习小组综合讨论积极度之和的最大值。输入样例1。输出样例1。输入样例2。输出样例2。数据范围:对于40%的测试点,保证ci=0。对于所有测试点,保证1≤n≤

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论