内容正文:
Python程序及数据结构综合
一、选择题
1.(2024·浙江·高考真题)有如下Python程序段:
for i in range(0,len(a)-1,2):
if i > 0 and a[i] < a[i-1]:
a[i],a[i-1] = a[i-1],a[i]
if a[i] < a[i+1]:
a[i],a[i+1] = a[i+1],a[i]
列表a有6个元素,运行该程序段后,a可能的值是( )
A.[2,9,8,6,9,3] B.[9,9,8,6,3,2] C.[9,3,6,2,8,9] D.[6,3,9,2,9,8]
【答案】D
【知识点】Python语言基础
【详解】本题考查Python程序设计相关内容。分析程序段,推知:列表a有6个元素,由“for i in range(0,len(a)-1,2)”知,列表a的索引i为0、2、4,且当i的值为2、4时,若a[i] < a[i-1],则交换两个元素,若a[i] < a[i+1],则交换两个元素,即:a[2]的值不能小于前面的a[1]和后面的a[3];a[4]的值不能小于前面的a[3]和后面的a[5]。AB选项中,8比前面相邻的9小,选项结果不可能。C选项,8比后面相邻的9小,选项结果不可能。D选项为可能结果,故本题答案是D选项。
2.(2024·浙江·高考真题)使用列表d模拟链表结构(节点数n>0),如图a所示,每个节点包含数据区域和指针区域,h为头指针。现要按链表顺序将这n个节点中的数据依次存放到d[0][0]、d[1][0]…d[n-1][0]中,最终保持节点链接关系不变,结果如图b所示。实现上述功能的Python程序段如下,方框中应填入的正确代码为( )
图a
图b
p,i = h,0
while p! =-1:
tp = d[p][1]
if p == i:
i+= 1
elif p>i:
d[i][0],d[p][0] = d[p][0],d[i][0]
i+= 1
p = tp
# 调整头指针h及指针区域,保持节点链接关系不变,代码略
d[i][1] = d[p][1]
d[p][1] = i
d[p][1] = d[i][1]
d[i][1] = p
d[i][1] = p
d[p][1] = d[i][1]
d[p][1] = i
d[i][1] = d[p][1]
A.
B.
C.
D.
A.A B.B C.C D.D
【答案】B
【知识点】Python语言基础
【详解】本题考查Python程序设计相关内容。本题涉及到数据结构链表操作知识。分析程序段,推知:
当前节点为p节点,p从头结点开始进行遍历。而变量i是从0开始递增的,当p和i相等时,表明链表是按链表顺序依次存放到d[0][0]、d[1][0]…d[n-1][0]的,符合题意,此时只需依次进行简单的迭代即可。若p和i不相等时,即数据的存放不符合题意,由于i是从0开始的,因此若p和i不等,则肯定是p>i,此时由代码可知将节点i和节点p的数据域进行交换,由于在链表中p的位置比节点i更加靠前,即p→i。而数据交换后两者的关系刚好逆转了,即i→p,因此可以先删除节点i,然后将节点i插入到p节点的前面,这样即可实现题意,故先执行代码 d[p][1]=d[i][1],删除节点i,然后再将节点i指向节点p,故代码为d[i][1]=p。……,以此类推直到循环结束。至此链表已实现按照顺序将这n个节点中的数据依次存放到d[0][0]、d[1][0]…d[n-1][0]中的目的,但循环结束后,还需要修改头指针h的值,以及重新调整每个节点的指针域数据(即代码略部分)。故本题答案是B选项。
3.(2024·浙江·高考真题)某二分查找算法的Python程序段如下:
i,j = 0,len(d)-1
while i <= j:
m = (i+j)//2 # 语句①
if key == d[m]:
break
elif key < d[m]:
j = m-1
else:
i = m+1
当d为[6,12,15,18,22,25,28,35,46]时,运行该程序段查找key,语句①的执行次数小于等于2;若将d修改为[6,12,15,18,22,25,28,35,46,58],重新运行该程序段,查找同一key值,则语句①的执行次数不可能为( )
A.1 B.2 C.3 D.4
【答案】C
【知识点】Python语言基础
【详解】本题考查Python程序设计相关内容。本题涉及到二分查找算法相关操作。分析程序段,推知:
数组d为[6,12,15,18,22,25,28,35,46]时,i=0,j=8,m=4,执行程序段,查找过程用二叉树表示如下:
语句①的执行次数小于等于2,该次数与key值在二叉树中的深度值一致,因此查找的数key可能是:22(1次查找)、12(2次查找)和28(2次查找)。若将d修改为[6,12,15,18,22,25,28,35,46,58],此时,i=0,j=9,m=4,查找过程用二叉树表示如下:
第一次查找的仍然是22,若往左查找,第二次是12。但若第二次往右查找,则找到的是35,而不是原先的28,然后继续第三次查找,找到25,接着进行第四次查找,找到28,此时查找过程结束。所以查找同一key值,则语句①的执行次数不可能为3,故本题答案是C选项。
4.(2024·浙江·高考真题)若字符串s的值为"abcde",执行如下程序段后,变量res的值不可能是( )
from random import randint
res =""
i, j = 0, len(s)-1
while i < len(s)and j >= i:
if randint(0,1)==0: #randint(0,1)随机生成0或1
res+= s[i]
i +=1
else:
res += s[j]
j-=1
A."abced" B."aecbd" C."aedbc" D."edcba"
【答案】B
【知识点】典型算法
【详解】本题考查Python程序设计相关内容。分析程序段,可知:
A选项,第一次循环,若randint(0,1)==0成立,将s[0](即字符'a')添加到res中,则res=“a”;第二次循环,若randint(0,1)==0成立,将s[1](即字符'b')添加到res中,则res=“ab”;第三次循环,若randint(0,1)==0成立,将s[2](即字符'c')添加到res中,则res=“abc”;第四次循环,若randint(0,1)==1成立,将s[4](即字符'e')添加到res中,则res=“abce”;第五次循环,若randint(0,1)==1成立,将s[3](即字符'd')添加到res中,则res=“abced”,选项正确。
B选项,第一次循环,若randint(0,1)==0成立,将s[0](即字符'a')添加到res中,则res=“a”;第二次循环,若randint(0,1)==1成立,将s[4](即字符'e')添加到res中,则res=“ae”;第三次循环,若randint(0,1)==0成立,将s[1](即字符'b')添加到res中,则res=“aeb”;第三次循环,若randint(0,1)==1成立,将s[3](即字符'd')添加到res中,则res=“aed”;由此推出,无论第三次循环产生的随机数是0还是1,都不会出现“aec”,继而推出选项错误。
C选项,第一次循环,若randint(0,1)==0成立,将s[0](即字符'a')添加到res中,则res=“a”;第二次循环,若randint(0,1)==1成立,将s[4](即字符'e')添加到res中,则res=“ae”;第三次循环,若randint(0,1)==1成立,将s[3](即字符'd')添加到res中,则res=“aed”;第四次循环,若randint(0,1)==0成立,将s[1](即字符'b')添加到res中,则res=“aedb”;第五次循环,若randint(0,1)==0或randint(0,1)==1成立,都会将s[2](即字符'c')添加到res中,则res=“aedbc”,选项正确。
D选项,第一次循环,若randint(0,1)==1成立,将s[4](即字符'e')添加到res中,则res=“e”;第二次循环,若randint(0,1)==1成立,将s[3](即字符'd')添加到res中,则res=“ed”;第三次循环,若randint(0,1)==1成立,将s[2](即字符'c')添加到res中,则res=“edc”;第四次循环,若randint(0,1)==1成立,将s[1](即字符'b')添加到res中,则res=“edcb”;第五次循环,若randint(0,1)==1成立,将s[0](即字符'a')添加到res中,则res=“edcba”,选项正确。
故本题答案是B选项。
5.(2023·浙江·高考真题)定义如下函数:
def rf(n):
if n<3:
return n
return rf(n-1)+rf(n-3)
执行语句v=rf(5),函数rf被调用的次数是( )
A.11 B.5 C.7 D.15
【答案】C
【知识点】Python语言基础
【详解】本题考查的是递归函数。执行语句v=rf(5)时, 调用3次(rf(5)、rf(4)、rf(2));执行rf(4)时调用2次(rf(3)、rf(1));执行rf(3)时调用2次(rf(2)、rf(0));一共调用了3+2+2=7。故本题应选C。
6.(2023·浙江·高考真题)列表s包含8个互不相等的元素,即s[0],s[1],s[2],……,s[7],有如下Python程序段:
n=8
for i in range(l,n-l):
for j in range(l,n-i-l):
if s[j]>s[j-l]
s[j],s[j-1]=s[j-1],s[j]
该程序段实现的是( )
A.s[0]到s[5]的降序排列 B.s[1]到s[6]的降序排列
C.s[1]到s[7]的升序排列 D.s[2]到s[6]的升序排列
【答案】A
【知识点】数据管理、典型算法
【详解】本题考查的是Python冒泡排序变式。结合外循环可知只对s[0]到s[5]进行排序,由选择语句s[j]>s[j-l],可知是降序排列,故选项A正确。
7.(2025·浙江·高考真题)数组元素a[0]~a[n-1]已按升序排列,现要将a[pos](0≤pos≤n-1)的值加1,并保持数组的有序性不变,实现该功能的程序段如下,方框中应填入的正确代码为( )
t=a[pos]+1
i=pos
while : a[i]=a[i+1]
i+=1
a[i]=t
A.i<n-1 B.i<n-1 and t>a[i+1]
C.i<n-1 and a[i]>a[i+1] D.i<=n-1 or t>a[i]
【答案】B
【知识点】排序算法的应用
【详解】本题考查排序。该程序段的目的是将 a[pos] 的值加 1 后,插入到合适位置以保持数组有序。首先将 a[pos] 加 1 的结果赋值给 t ,然后从 pos 位置开始往后比较。 当 i < n - 1 时,说明还未到达数组末尾,有后续元素可供比较。 当 t > a[i + 1] 时,意味着当前 t 的值大于下一个元素 a[i + 1] ,需要将 a[i + 1] 往前移动一位,即执行 a[i]=a[i + 1] ,然后 i 自增 1 继续往后比较。 只有同时满足 i < n - 1 和 t > a[i + 1] 这两个条件时,才需要进行比较操作,当不满足这个 while 循环条件时,说明找到了 t 应插入的位置,此时将 t 赋值给 a[i] 。 A选项 i < n - 1 只判断了是否到达数组末尾,没有判断 t 和后续元素的大小关系,无法保证插入位置的正确性;B选项 i < n - 1 and a[i] > a[i + 1] 比较的是当前元素和下一个元素的大小关系,并非 t 和下一个元素的大小关系;C选项 i <= n - 1 or t > a[i] 中使用了逻辑或 or ,只要满足其中一个条件就会执行循环,会导致插入位置错误。因此,本题选择B。
8.(2023·浙江·高考真题)列表q长度为20,q[0]至q[4]的值依次为'p','r','i','n','t',执行如下程序段后,输出的最后一个字符为( )
head,tail=0,5
while head< tail:
if head%3==0:
print(q[head])
else:
q[tail]=q[head]
tail+=1
head+=1
A.t B.n C.i D.r
【答案】D
【知识点】队列的基本操作
【详解】本题考查单向顺序队列的基本操作(数组实现)。根据队列基本操作可知程序段的功能是:当队列q非空时(空队列为head==tail),根据头指针的索引位置(head%3==0),分别执行“出队”操作或者“出队并入队”操作,再结合题意,本题求解的是最后一个出队元素。用表格法模拟该队列头、尾指针和“出队”操作的变化,如下表:
head
tail
队列q
出队字符
0
5
p,r,i,n,t
P
3
7
n,t,r,i
n
6
9
i,t,r
i
9
11
t,r
t
12
13
r
r
综上所述,故选D。
9.(2025·浙江·高考真题)对于任意非空字符串s,甲、乙程序段输出结果相同,则乙程序段加框处的正确代码为( )
def f(s,t):
if t>=len(s)-2:
return s[t]
return f(s,t+2)+s[t]
print(f(s,0))
r=""
n=len(s)
for i in range(0,n,2):
print(r)
甲程序段
乙程序段
A.r=s[n-i]+r B.r=r+s[n-i-1] C.r=r+s[i] D.r=s[i]+r
【答案】D
【知识点】迭代
【详解】本题考查递归与迭代。在甲程序段中,假设输入:"ABC123",则输出结果为"2CA";乙程序需要完成相同功能,依次代入各选项可得:A选项错误,i=0时,s[n - i] 会导致下标越界;B选项错误,首先添加 s[5],即 "3",然后当 i = 2 时,添加 s[3],即 "1",最后当 i = 4 时,添加 s[1],得到 "31B",与甲程序段结果不同;C选项错误,当 i = 0 时,将添加 s[0],然后当 i = 2 时,添加 s[2],最后当 i = 4 时,添加 s[4],得到"AC2";D选项正确,当 i = 0 时,将添加 s[0] 到 r 的左边,然后当 i = 2 时,添加 s[2] 到左边,最后当 i = 4 时,添加 s[4] 到左边,得到"2CA"。因此,本题选择D。
10.(2024·浙江·高考真题)使用列表d模拟链表结构(节点数大于0)每个节点包含数据区域和指针区域,h为头指针。链表中各节点已按数据区域中数值的绝对值由小到大排列,如图a所示。现要修改该链表各节点的链接关系,使链表各节点按数据区域中的数值由小到大排列,结果如图b所示。实现该功能的程序段如下,方框中应填入的正确代码为( )
图a 图b
t = h
p = d[h][1]
while p != -1:
q = d[p][1]
p = q
d[t][1]=-1
A. B. C. D.
【答案】C
【知识点】链表的概念
【详解】本题考查单链表及分支语句和数据排序等知识。 由于数据区域中数值的绝对值由小到大排列,由代码可知,原先的节点关系是:t→p→q,若数据区域d[p][0]的数值为正数,则原链表节点关系不变,只需将各节点关系往下迭代即可,即:t变为p,p变为g即可。若数据区域d[p][0]的数值为负数,则原先的链表各节点关系需要重新指向,由于原数据是按照绝对值大小排序的,因此越往后面绝对值数越大,因此其相反数(负数)就越小,这样每一个当前节点p的负数肯定是当前链表中最小的数,因此该数应该变为最小的头节点,采用头插法可以实现,即将当前节点p的指针域指向原先的头节点h,然后再将头节点h变为当前节点p。故本题选C。
11.(2025·浙江·高考真题)列表c长度为100,如图所示,其中c[10]~c[89]各元素的值均为10以内的随机正整数。执行如下程序段,输出的最后一行是( )
i
0
1
2
3
4
5
6
7
8
9
……
90
91
92
93
94
95
96
97
98
99
c[i]
1
1
1
1
2
3
2
3
2
3
……
2
3
2
2
2
2
1
1
1
1
qa=[0,0,0,0,0]
qb=[0,0,0,0,0]
h,t=0,4
temp=0
for k in range(100):
qa[t]=c[k]
qb[t]=temp+qa[t]-qa[h]
print(qb[h],qb[t])
temp=qb[t]
t=(t+1)%5
h=(h+1)%5
A.5 4 B.8 4 C.9 5 D.9 9
【答案】B
【知识点】循环结构的程序实现、队列的基本操作
【详解】本题考查队列。程序中使用了两个列表qa和qb,以及两个指针h和t,通过循环对列表c进行处理。 从代码逻辑看,qa[t] = c[k]是将c中的元素依次存入qa中,qb[t] = temp + qa[t] - qa[h]是根据之前的计算结果和当前qa中的值进行计算并存入qb 。temp = qb[t]用于保存当前qb[t]的值,以便下一次计算,t = (t + 1) % 5和h = (h + 1) % 5是对指针进行循环移动,并且 t 与 h 始终相差 4。 当k小于4时,qa[h]的值均为0,即qb的前4项依次为c数组累加和,qb[4]的值为 c[0]至c[4]五项的和减去 c[0]的值,因此 qb[t]为第t项以及前4项的和。最后一次循环时,qb[t]=qb[99]=c[96]+c[97]+c[98]+c[99]=4;qb[h]=qb[95]=c[92]+c[93]+c[94]+c[95]=8。因此,本题选择B。
12.(2023·浙江·高考真题)有如下Python程序段:
import random
a=['A','B','#','#','C','D','#']
stk=[0]*len(a);top=-l
for i in range(len(a)):
op=random. randint(0,1) # 随机生成0或1
if op= =l and a[i]!='#":
top+=l;stk[top]=a[i]
a[i]='#'
elif op= =0 and top!=-1 and a[i]= ='#':
a[i]=stk[top];top-=l
执行该程序段后,a的值不可能的是( )
A.['A','B','#','#','C','D','#'] B.['#','#','#','#','#','#','#']
C.['#','B','#','#','C';'D','A'] D.['#','#','A','B','C','D','#']
【答案】D
【知识点】栈的基本操作
【详解】本题考查的是堆栈的操作。堆栈的操作原则先进后出。stk可以看做一个堆栈,阅读程序可知对列表a中的字母进行入栈和出栈操作。选项A没有进行入栈和出栈操作,有可能;选项B把字母全部压入栈,有可能;选项C对字母A进行入栈,最后出栈,有可能;选项D,先把字母A、B进行入栈,然后出栈,出栈顺序应为B、A,故选项D不可能。
试卷第1页,共3页
试卷第1页,共3页
学科网(北京)股份有限公司
$$
Python程序及数据结构综合
一、选择题
1.(2024·浙江·高考真题)有如下Python程序段:
for i in range(0,len(a)-1,2):
if i > 0 and a[i] < a[i-1]:
a[i],a[i-1] = a[i-1],a[i]
if a[i] < a[i+1]:
a[i],a[i+1] = a[i+1],a[i]
列表a有6个元素,运行该程序段后,a可能的值是( )
A.[2,9,8,6,9,3] B.[9,9,8,6,3,2] C.[9,3,6,2,8,9] D.[6,3,9,2,9,8]
2.(2024·浙江·高考真题)使用列表d模拟链表结构(节点数n>0),如图a所示,每个节点包含数据区域和指针区域,h为头指针。现要按链表顺序将这n个节点中的数据依次存放到d[0][0]、d[1][0]…d[n-1][0]中,最终保持节点链接关系不变,结果如图b所示。实现上述功能的Python程序段如下,方框中应填入的正确代码为( )
图a
图b
p,i = h,0
while p! =-1:
tp = d[p][1]
if p == i:
i+= 1
elif p>i:
d[i][0],d[p][0] = d[p][0],d[i][0]
i+= 1
p = tp
# 调整头指针h及指针区域,保持节点链接关系不变,代码略
d[i][1] = d[p][1]
d[p][1] = i
d[p][1] = d[i][1]
d[i][1] = p
d[i][1] = p
d[p][1] = d[i][1]
d[p][1] = i
d[i][1] = d[p][1]
A.
B.
C.
D.
A.A B.B C.C D.D
3.(2024·浙江·高考真题)某二分查找算法的Python程序段如下:
i,j = 0,len(d)-1
while i <= j:
m = (i+j)//2 # 语句①
if key == d[m]:
break
elif key < d[m]:
j = m-1
else:
i = m+1
当d为[6,12,15,18,22,25,28,35,46]时,运行该程序段查找key,语句①的执行次数小于等于2;若将d修改为[6,12,15,18,22,25,28,35,46,58],重新运行该程序段,查找同一key值,则语句①的执行次数不可能为( )
A.1 B.2 C.3 D.4
4.(2024·浙江·高考真题)若字符串s的值为"abcde",执行如下程序段后,变量res的值不可能是( )
from random import randint
res =""
i, j = 0, len(s)-1
while i < len(s)and j >= i:
if randint(0,1)==0: #randint(0,1)随机生成0或1
res+= s[i]
i +=1
else:
res += s[j]
j-=1
A."abced" B."aecbd" C."aedbc" D."edcba"
5.(2023·浙江·高考真题)定义如下函数:
def rf(n):
if n<3:
return n
return rf(n-1)+rf(n-3)
执行语句v=rf(5),函数rf被调用的次数是( )
A.11 B.5 C.7 D.15
6.(2023·浙江·高考真题)列表s包含8个互不相等的元素,即s[0],s[1],s[2],……,s[7],有如下Python程序段:
n=8
for i in range(l,n-l):
for j in range(l,n-i-l):
if s[j]>s[j-l]
s[j],s[j-1]=s[j-1],s[j]
该程序段实现的是( )
A.s[0]到s[5]的降序排列 B.s[1]到s[6]的降序排列
C.s[1]到s[7]的升序排列 D.s[2]到s[6]的升序排列
7.(2025·浙江·高考真题)数组元素a[0]~a[n-1]已按升序排列,现要将a[pos](0≤pos≤n-1)的值加1,并保持数组的有序性不变,实现该功能的程序段如下,方框中应填入的正确代码为( )
t=a[pos]+1
i=pos
while : a[i]=a[i+1]
i+=1
a[i]=t
A.i<n-1 B.i<n-1 and t>a[i+1]
C.i<n-1 and a[i]>a[i+1] D.i<=n-1 or t>a[i]
8.(2023·浙江·高考真题)列表q长度为20,q[0]至q[4]的值依次为'p','r','i','n','t',执行如下程序段后,输出的最后一个字符为( )
head,tail=0,5
while head< tail:
if head%3==0:
print(q[head])
else:
q[tail]=q[head]
tail+=1
head+=1
A.t B.n C.i D.r
9.(2025·浙江·高考真题)对于任意非空字符串s,甲、乙程序段输出结果相同,则乙程序段加框处的正确代码为( )
def f(s,t):
if t>=len(s)-2:
return s[t]
return f(s,t+2)+s[t]
print(f(s,0))
r=""
n=len(s)
for i in range(0,n,2):
print(r)
甲程序段
乙程序段
A.r=s[n-i]+r B.r=r+s[n-i-1] C.r=r+s[i] D.r=s[i]+r
10.(2024·浙江·高考真题)使用列表d模拟链表结构(节点数大于0)每个节点包含数据区域和指针区域,h为头指针。链表中各节点已按数据区域中数值的绝对值由小到大排列,如图a所示。现要修改该链表各节点的链接关系,使链表各节点按数据区域中的数值由小到大排列,结果如图b所示。实现该功能的程序段如下,方框中应填入的正确代码为( )
图a 图b
t = h
p = d[h][1]
while p != -1:
q = d[p][1]
p = q
d[t][1]=-1
A.B.C. D.
11.(2025·浙江·高考真题)列表c长度为100,如图所示,其中c[10]~c[89]各元素的值均为10以内的随机正整数。执行如下程序段,输出的最后一行是( )
i
0
1
2
3
4
5
6
7
8
9
……
90
91
92
93
94
95
96
97
98
99
c[i]
1
1
1
1
2
3
2
3
2
3
……
2
3
2
2
2
2
1
1
1
1
qa=[0,0,0,0,0]
qb=[0,0,0,0,0]
h,t=0,4
temp=0
for k in range(100):
qa[t]=c[k]
qb[t]=temp+qa[t]-qa[h]
print(qb[h],qb[t])
temp=qb[t]
t=(t+1)%5
h=(h+1)%5
A.5 4 B.8 4 C.9 5 D.9 9
12.(2023·浙江·高考真题)有如下Python程序段:
import random
a=['A','B','#','#','C','D','#']
stk=[0]*len(a);top=-l
for i in range(len(a)):
op=random. randint(0,1) # 随机生成0或1
if op= =l and a[i]!='#":
top+=l;stk[top]=a[i]
a[i]='#'
elif op= =0 and top!=-1 and a[i]= ='#':
a[i]=stk[top];top-=l
执行该程序段后,a的值不可能的是( )
A.['A','B','#','#','C','D','#'] B.['#','#','#','#','#','#','#']
C.['#','B','#','#','C';'D','A'] D.['#','#','A','B','C','D','#']
试卷第1页,共3页
试卷第1页,共3页
学科网(北京)股份有限公司
参考答案
题号
1
2
3
4
5
6
7
8
9
10
答案
D
B
C
B
C
A
B
D
D
C
题号
11
12
答案
B
D
1.D
2.B
3.C
4.B
5.C
6.A
7.B
8.D
9.D
10.C
11.B
12.D
答案第1页,共2页
答案第1页,共2页
学科网(北京)股份有限公司
$$