点击上方蓝字·关注我们



CCF编程能力等级认证,英文名Grade Examination of Software Programming(以下简称GESP),由中国计算机学会发起并主办,是为青少年计算机和编程学习者提供学业能力验证的平台。GESP覆盖中小学全学段,符合条件的青少年均可参加认证。GESP旨在提升青少年计算机和编程教育水平,推广和普及青少年计算机和编程教育。
GESP考察语言为图形化编程、Python编程及C++编程,主要考察学生掌握相关编程知识和操作能力,熟悉编程各项基础知识和理论框架,通过设定不同等级的考试目标,让学生具备编程从简单的程序到复杂程序设计的编程能力,为后期专业化编程学习打下良好基础。
本次为大家带来的是2025年3月Python七级认证真题解析。
Python 七级
2025年03月
一、单选题(每题2分,共30分)
题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
答案 | B | C | A | B | B | A | A | B | C | A | B | B | A | B | A |
第1题 下列哪个选项是python中的关键字?
A. function
B. class
C. method
D. object
答案:B
分析:class是Python中定义类的关键字,其他选项如function、method、object均不是关键字。
第2题 下面程序的时间复杂度是 ()

A. n
B. n*log(n)
C. n的平方
D. n的立方
答案:C
分析:双重循环的总次数为n+ n − 1 + n − 2 + n − 3 + ...1 = n(n+ 1)/2 ,时间复杂度为O(n2)。
第3题 以下代码输出的是什么 ()

A. 1 2
B.报错
C. None 2
D. 1 None
答案:A
分析:B继承A并调⽤super(). init () ,正确初始化x和y,输出为1 2 。
第4题pow(10, log10(100))的值是
A. 10
B. 100
C. 1000
D. 10000
答案:B
分析:log10(100) = 2 ,因此 pow(10, 2) = 100 。
第5题exp(log(2))的值是 ()
A. 1
B. 2
C. 3
D. 10
答案:B
分析:exp(log(2))等价于e^ln2=2。
第6题 给定一个无向图 ,图的节点编号从 0到n-1,图的边以邻接表的形式给出。编写的一个python程序 ,使⽤深 度优先搜索( DFS)遍历该图 ,并输出遍历的节点顺序。 下面程序中横线处应该填写的是 ()

A. dfs(graph, neighbor, visited)
B. dfs(graph+1, neighbor, visited)
C. dfs(graph, neighbor)
D. dfs(graph+1, visited)
答案:A
分析:DFS递归需传递graph、当前邻居neighbor和已访问集合visited,正确调⽤为dfs(graph, neighbor, visited) 。
第7题[10, 9, 2, 5, 3, 7, 101, 18] ,最长的严格上升子序列是 ()
A. [2, 3, 7, 101] ,长度为4
B. [2, 5, 7, 101] ,长度为5
C. [2, 5, 7, 101] ,长度为3
D. [2, 5, 7, 18] ,长度为6
答案:A
分析:最长严格上升子序列为 [2, 3, 7, 101] ,长度为4。
第8题 给定一个整数数组 nums,找到其中最长的严格上升子序列的长度。子序列 是指从原数组中删除一些元素 (或不删除)后 ,剩余元素保持原有顺序的序列。
要求:子序列必须是严格上升的(即每个元素都⽐前一个元素⼤)。 返回最长严格上升子序列的长度。
横线处应该填写的是 ()

A. dp[i] = max(dp[i], dp[j])
B. dp[i] = max(dp[i], dp[j] + 1)
C. dp[i] = max(dp[i]+1, dp[j] + 1)
D. dp[i] = max(dp[i]+1, dp[j])
答案:B
分析:动态规划中,若nums[j] < nums[i] ,则dp[i]应更新为max(dp[i], dp[j] + 1) 。
第9题 以下代码的时间复杂度是多少?

A. n
B. n的平方
C. 2的n次幂
D. log(n)
答案:C
分析:递归计算斐波那契数的未优化版本时间复杂度为O(2n)。
第10题 以下代码的时间复杂度是多少?

A. n
B. n的平方
C. 2的n次幂
D. log(n)
答案:A
分析:通过记忆化(memo)优化后 ,时间复杂度降为 O(n)。
第11题 以下代码的功能是什么?

A.计算数组的最⼤值
B.计算数组的最⼤子数组和
C.计算数组的最⼩值
D.计算数组的最⼩子数组和
答案:B
分析:代码通过动态规划计算数组的最⼤子数组和。
第12题 以下代码的功能是什么?

A.计算硬币的组合数
B.计算硬币的最⼩数量 ,使得总⾦额等于目标⾦额
C.计算硬币的最⼤数量 ,使得总⾦额等于目标⾦额
D.计算硬币的总⾦额
答案:B
分析:该算法⽤于计算⽤最少硬币数凑出目标金额。
第13题 以下代码的功能是什么?

A.计算两个字符串的最长公共子序列
B.计算两个字符串的最长公共子串
C.计算两个字符串的最长公共前缀
D.计算两个字符串的最长公共后缀
答案:A
分析:动态规划表填充规则对应最长公共子序列(LCS) 的计算。
第14题 以下代码的功能是什么?

A.计算背包问题的最⼩价值
B.计算背包问题的最⼤价值
C.计算背包问题的最⼩重量
D.计算背包问题的最⼤重量
答案:B
分析:动态规划解决0-1背包问题 ,求最⼤价值。
第15题 以下代码的功能是什么?

A.计算从左上角到右下角的唯一路径数
B.计算从左上角到右下角的最短路径
C.计算从左上角到右下角的最长路径
D.计算从左上角到右下角的最⼩路径
答案:A
分析:动态规划计算⽹格中左上角到右下角的唯一路径数。
二、判断题(每题2分 ,共 20分)
题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
答案 | × | √ | √ | × | × | √ | √ | × | √ | √ |
第1题 表达式 1e6、1000000和10^6的值是相同的。
答案:×
分析:10^6在Python中是异或运算,结果为12,与1e6和1000000不同。
第2题 在python语⾔中 ,函数调⽤前必须有函数声明或定义。
答案:√
分析:Python要求函数调⽤前必须有定义或声明。
第3题 快速排序一般是不稳定的。
答案:√
分析:快速排序通常是不稳定的。
第4题 int类型能表达的数都能使⽤float类型精确表达。
答案:×
分析:float无法精确表⽰所有 int范围内的整数。
第5题 使⽤了math模块中的表达式cos(60)的结果类型为float、值约为0.5。
答案:×
分析:cos(60)的参数是弧度,实际计算的是60弧度的余弦值,约为-0.952。
第6题一颗N层的满二叉树 ,一定有2N − 1个结点。
答案:√
分析:满二叉树的节点数为2N−1。
第7题 邻接表和邻接矩阵都是图的存储形式。为了操作时间复杂度考虑 ,同一个图可以同时维护两种存储形式。
答案:√
分析:邻接表和邻接矩阵可以同时维护以提⾼不同操作的效率。
第8题子类对象包含父类的所有成员(包括私有成员)。从父类继承的私有成员也是子类的成员 ,因此子类可以直接访问。
答案:×
分析:子类无法直接访问父类的私有成员。
第9题 动态规划算法通常有递归实现和递推实现。但由于递归调⽤在运⾏时会由于层数过多导致程序崩溃 ,因此有 些动态规划算法只能⽤递推实现。
答案:√
分析:递归可能导致栈溢出 ,递推实现更安全。
第10题 按照下面的规则生成一棵二叉树:以一个⼈为根节点 ,其父亲为左子节点 ,母亲为右子节点。对其父亲、母亲分别⽤同样规则生成左子树和右子树。以此类推 ,记录30代的直系家谱 ,则这是一棵满二叉树。
答案:×
分析:家谱树可能存在节点缺失 ,无法保证是满二叉树。
三、编程题(每题25分 ,共 50分)
编程题1
时间限制:3.0 s
内存限制:512.0 MB 图上移动
题目描述
小A有一张包含n个结点与m条边的无向图,结点以1,2,…,n标号。小A会从图上选择一个结点作为起点,每一步移动到某个与当前小A所在结点相邻的结点。对于每个结点i(1≤ i≤n),小A想知道从结点i出发恰好移动1,2,…,k步之后,小A可能位于哪些结点。由于满足条件的结点可能有很多,你只需要求出这些结点的数量。
输入格式
第一行,三个正整数n,m,k,分别表示无向图的结点数与边数,最多移动的步数。接下来m行,每行两个正整数ui,vi,表示图中的一条连接结点ui与vi的无向边。输出格式
共n行,第i行(1≤i≤ n)包含k个整数,第j个整数(1≤ j ≤k)表示从结点i出发恰好移动j步之后可能位于的结点数量。
样例
输入样例1

输出样例1

数据范围
对于20%的测试点 ,保证 k= 1。
对于另外20%的测试点 ,保证 1≤ n ≤50 ,1≤ m ≤50。
对于所有测试点,保证1≤ n ≤500,1≤ m ≤500,1≤ k ≤20,1≤ ui, vi≤n。
题目分析
题目要求计算从图上每个结点移动k步后能到的结点数量。 分析:每个结点移动0步能到的结点数量是多少呢?0。
每个结点移动1步能到的结点数量是多少呢?该结点能直达的结点数量。每个结点移动2步能到的结点数量是多少呢?移动一步能到的结点+这些结点直达的结点。
很明显是一个dp。具体思路:
1.使⽤三维数组f[t][x][y]表⽰从起点x出发经过t步后能否到达节点y。若可达则标记为1,否则为0。
2.初始化:当步数t=0时,每个起点只能停留在⾃⾝节点,因此f[0][x][x]=1。
3.状态转移:对于每一步t,遍历所有可能的起点x和当前节点y。若f[t-1][x][y]为真(即存在路径到
达y),则遍历y的所有相邻节点z,将f[t][x][z]标记为真。这一步模拟了从y移动一步到其邻居的过程。
4.结果统计:对于每个起点x和步数t,统计所有f[t][x][y]为真的节点y的数量。
参考程序

编程题2
时间限制:3.0 s
内存限制:512.0 MB 等价消除
题目描述
小A有一个仅包含小写英⽂字的字符串S。
对于一个字符串,如果能通过每次删去其中两个相同字符的方式,将这个字符串变为空串,那么称这个字符串是可以被等价消除的。
小A想知道S有多少子串是可以被等价消除的。
一个字符串S′是S的子串,当且仅当删去S的某个可以为空的前缀和某个可以为空的后缀之后,可以得到S′。
输入格式
第一行,一个正整数∣S∣,表示字符串S的长度。第二行,一个仅包含小写英⽂字的字符串S。
输出格式
一行,一个整数,表示答案。
样例
输入样例1

输出样例1

输入样例2

输出样例2

数据范围
对于20%的测试点,保证S中仅包含a和b两种字符。 对于另外 20%的测试点,保证1≤∣S∣≤2000。
对于所有测试点,保证1≤∣S∣≤2×105。
题目分析
题目要求统计字符串中所有可以被等价消除的子串数目。等价消除的条件是子串中每个字符的出现次数均为偶数 次。根据这个关键信息 ,那我们可以使⽤前缀异或状态的方法⾼效解决 ,具体思路如下。
1.前缀异或状态:使⽤一个26位的二进制数表⽰每个字符的出现次数的奇偶性。每次处理字符时 ,异或对应的二进制位。
2.状态统计:维护一个哈希表记录每个状态出现的次数。初始状态为0,出现次数为1。
3.在线计算答案:遍历字符串时,当前状态出现过的次数即为新增的合法子串数目,累加这些数目即可得到答案。
参考程序

策划:GESP技术委员会副主席 刘晓庆
技术支持:马强

1.GESP微信:关注“CCF GESP”公众号,点击"GESP小助手"即可交流。
2.GESP邮箱:gesp@ccf.org.cn
注:请在邮件中详细描述咨询的问题并留下考生的联系方式及姓名、身份证号,以便及时有效处理。
3.GESP电话:0512-67656856
咨询时间:周一至周五(法定节假日除外):上午 8:30-12:00;下午 13:00-17:30
