2025新教材技术高考第一轮基础练习--通用技术专题七 数据的组织(含答案)

资源下载
  1. 二一教育资源

2025新教材技术高考第一轮基础练习--通用技术专题七 数据的组织(含答案)

资源简介

中小学教育资源及组卷应用平台
2025新教材技术高考第一轮
专题七 数据的组织
考点过关练
考点一 数组
1.(2022浙北G2联盟期中,15)有如下Python 程序段:
import random
a=[]
for i in range(10):
    a.append(random.randint(1,100))
i=0
while i <10:
    if i==0:
      i=i+1
    elif a[i-1]<=a[i]:
         ①   
    else:
      a[i],a[i-1]=a[i-1],a[i]
         ②   
print(a)
执行该程序段实现了随机生成一个数组,并将其元素递增输出的功能。划线处的代码应该是(  )
A.① i+=1 ② i=1
B.① i-=1 ② i=1
C.① i+=1 ② i+=1
D.① i-=1 ② i-=1
2.(2022绍兴诸暨期中,3)使用列表生成的方式创建数组代码如下:
a=[i*i-1 for i in range(10) if i%2==0]
则数组元素a[3]的值为(  )
A.2   B. 8   C. 15   D. 35
3.(2022绍兴诸暨期中,4)设有一个5×8的二维数组a,若按行优先的顺序存储数组元素,则元素a[3][5]前面元素的个数为(  )
A.21   B. 22   C. 29   D. 37
4.(2022绍兴诸暨期中,13)有如下Python程序段:
a=[[0 for i in range(3)]for j in range(3)]
for i in range(3):
 for j in range(3):
  a[i][j]=i*5+j+1
for i in range(1,3):
 for j in range(2):
  print(a[j][i],end=" ")
程序段执行后,输出的结果是(  )
A.2 3 7 8    B.7 12 8 13
C.2 7 3 8    D.6 7 11 12
5.(2022杭州期中,10)下述代码段用于实现在数组a中将新数据k插入下标为 j(0<=j<=8)的位置:
a=[8,6,12,3,5,7,11,2,10,0]
i=8
while i>=j:
    (1)  
    (2)  
  (3)  
横线处的代码由以下五部分中的三部分组成:
①a[i+1]=k ②a[i]=k ③a[i+1]=a[i]
④a[i]=a[i-1] ⑤i=i-1
下列选项中代码选择与顺序正确的是(  )
A.③⑤②   B.⑤③①   C.③⑤①   D.④⑤②
6.(2022嘉兴期中,3)用 Python 程序段定义一个3行4列的二维数组(要求先将各元素的值初始化为0,再将第2行第 2 个元素重新赋值为1),以下程序段可行的是(  )
A. arr=[[0]*3 for j in range(4)]
arr[2][2]=1
B.arr=[[0]*4]*3
arr[1][1]=1
C.arr=[[0 for i in range(4)]for j in range(3)]
arr[1][1]=1
D.arr=[[0,0,0,0]for j in range(3)]
arr[2][2]=1
考点二 链表
1.(2022浙南名校联盟期末,12)一个头指针 head=2 的单向链表 L=[[30,4], [10,-1], [20,0], [15,1],[21,3]]通过以下 Python 程序段,转换为原链表的逆序链表,即头指针 head=1,L=[[30,2], [10,3], [20,-1], [15,4],[21,0]]。
 q=-1
 p=head #head 为原链表头指针
 while p!=-1 :
  tmp=L[p][1]
  
 head=q
上述程序段中方框处可选的语句为:
①p=tmp ②q=p ③L[p][1]=q
则方框处语句依次为(  )
A.③②①   B.③①②   C.①③②   D.①②③
2.(2022浙北G2联盟期中,14)用两个列表a、b分别保存单向链表中的数据区域和指针区域。如图所示,在节点x与节点y之间插入一个新节点,操作步骤正确的是(  )
①b[i]=b[y]     ②b[i]=b[x]
③b[y]=i    ④b[x]=i
⑤b[i]=x    ⑥b[i]=y
A.③⑥   B.④②   C.①③   D.②④
3.(2023浙江开学考,10)已知一个链表a,其a[i][0]存储索引i下节点的数据区域,a[i][1]存储索引i下节点的指针区域。对于当前链表中的一个节点p(索引为p),若要删除p的后一个节点q(q=a[p][1]),则应执行语句(  )
A.a[p]=a[q]
B.a[p][1]=a[q][1]
C.a[p]=a[a[q][1]]
D.a[p]=a[q];a[p][1]=a[q][1]
4.(2022杭州期中,12)在Python中用列表模拟链表结构,某程序段如下:
a=[['H',1],['a',2],['n',3],['g',4],['2',5],['0',6],['2',7],['2',0]]
p, head=3,3;q,c=-1,0;m,n=3,0
while n<4:
  c=c+1
  if c==m:
    n=n+1;c=0
    if p==head:
head=a[p][1]
a[q][1]=head
p=a[p][1]
    else:
 a[q][1]=a[p][1]
 p=a[p][1]
  else:
q=p
p=a[p][1]
#从头节点开始遍历链表a逻辑顺序的所有节点,并依次输出节点的数据,代码略
该程序段执行后的输出结果为(  )
A.ng02   B.g02n   C.2an2   D.22an
5.(2022诸暨期末,8)某单向链表如图所示,在data2与data3之间插入一个新节点data4(p指向data2,r指向data4。列表data来记录链表数据域,列表next来记录指针域),以下选项中正确的执行步骤为(  )
①next[p]=next[r]    ②next[p]=r
③next[r]=p    ④next[r]=-1
⑤next[r]=next[p]    ⑥next[p]=-1
A.③⑥   B.⑤②   C.①④   D.⑤②④
6.(2022杭嘉湖金月考,15)山顶上有10个圆形排列的洞,一只狐狸和一只兔子各住一个洞。狐狸总想吃掉兔子。一天兔子对狐狸说:“你想吃我有一个条件,先把洞从1~10编上号,你先到1号洞找我;第二次隔1个洞(即3号洞)找我,第三次隔2个洞(即6号洞)找我,依此类推,次数不限。但狐狸从早到晚进进出出了1000次,仍没有找到兔子。请问兔子可能躲在哪个洞里
实现上述功能的Python程序如下,请在划线处填入合适的代码。
hole=[]
n=10
m=1000
#构造一个循环链表,并给n个洞编号,设置洞的初始标志为0
#链表的节点样式为:[洞的标志,洞的编号]
for i in range(n-1):
  hole.append([0,i+1])
     (1)     
#狐狸开始找兔子,将进入过的洞标志改为1,寻找m次结束
head=0
k=head
hole[0][0]=1
for i in range(1,m):
  for j in range(1,i+2):
        (2)     
  hole[k][0]=1
#输出标志仍为0的洞,即兔子可能的藏身地点
for i in range (len(hole)):
  if hole[i][0]==0:
    print("兔子可能躲在第"+ (3) +"号洞")
考点三 队列
1.(2024届七彩联盟联考,11)有如下程序段:
s=input()
head=0;tail=0;ans=0;tmp=' '
q=[' ']*100
flag=True
for i in range(len(s)):
 if s[i]==',':
  while head!=tail:
   tmp+=q[head]
head+=1
if flag and head head+=1
flag=not flag
  ans+=int(tmp)
  tmp=' ';flag=True
 elif '0'<=s[i]<='9':
  q[tail]=s[i]
  tail+=1
输入s为"1-500,2023900-,",执行该程序段,变量ans的值为(  )
A.100   B.22300   C.22351   D.22400
2.(2022杭州“六县九校”期中,5)有A、B、C、D、E五个人依次进入电梯,结果警告超重了,需要出去一个人才能正常运行,按照数据结构中栈和队列的思维,应离开电梯的人分别是(  )
A.栈:A 队列:E    B.栈:A 队列:A
C.栈:E 队列:A    D.栈:E 队列:E
3.(2024届强基联盟联考,9)执行下列Python程序段,输出结果为(  )
data=[1,2,3,1,2,3]
que=[0]*10
head=tail=0
for i in range(len(data)):
if data[i]%2 !=0:
  que[tail]=data[i]
  tail+=1
elif tail-head>1:
  que[tail-1]+=que[head]
  head+=l
print(que[head:tail])
A.[3,2,1]    B.[1,2,3]
C.[1,3,1]    D.[3,2,3]
4.(2024届新阵地联盟第二次联考,11)有如下程序段:
m=3;n=7
head=tail=0;ans=0
vis=[0]*10;q=[0]*10
for i in range(n):
x=int(input())
if(vis[x]=0):
 ans+=1
 if(tail-head>=m):
  vis[q[head]]=0
  head+=1
 q[tail]=x
 tail+=1
 vis[x]=1
print(ans)
运行该程序段,依次输入x的值:1,2,1,5,4,4,1。则程序运行完成后ans 的值是(  )
A.3   B.4   C.5   D.6
5. (2024届天域全国名校协作体联考,12)已知列表a的长度为6,a[0]至a[5]的值依次为18,12,24,15,21,0,某程序如下所示:
head, tail=0,5
x=a[head]
head+=1
while (head+1) % len(a) !=tail:
   t=y=a[head]
head=(head+1) % len(a)
if x  x,y=y,x
if x % y !=0:
  a[tail]=x % y
  tail=(tail+1) % len(a)
x=t
print(a[head])
程序运行后,输出的结果是(  )
A.24    B.12   
C.3    D.0
6.(2023“山水联盟”开学考,11)有如下Python程序代码:
s="ABCDEF"; head=0;tail=0
que=[" "]*100
for i in range(len(s)):
if i%2==0:
 que[tail]=s[i]
else:
 que[tail]=s[len(s)-i]
tail=tail+1
for i in range(len(s)):
print(que[head], end=" ")
head=head+1
以上程序运行后,输出列表的情况是(  )
A.ABCDEF    B.FEDCBA
C.ACEFDB    D.AFCDEB
考点四 栈
1.(2022浙南名校联盟期末,10)一个栈的入栈序列为“6、9、5、7、8、3”,其出栈序列不可能是(  )
A.3、8、7、5、9、6
B.7、5、9、8、6、3
C.6、5、7、9、3、8
D.5、9、6、3、7、8
2.(2024届百校起点调研测试,9)栈q初始有三个值,经过一系列入栈、出栈操作后,栈为空,若元素出栈的顺序是1,2,3,4,5,6,7,则栈q初始的情况可能是(  )
A.[1,2,3]    B.[7,5,6]
C.[6,3,1]    D.[4,7,2]
3.(2024届Z20联盟联考,9)若元素入栈的顺序是1,2,3,4,5,6,不允许连续三次入栈,则可能的出栈序列为(  )
A.2,3,5,1,6,4    B.1,2,3,6,5,4
C.2,4,3,1,6,5    D.2,5,4,6,3,1
4.(2024届七彩联盟联考,9)假设栈S的最大长度为3,其初始状态和终止状态均为空,经过一系列入栈和出栈的操作,若元素最后的出栈序列为F,E,D,C,B,A,则可能的入栈顺序为(  )
A.ABCDEF    B.ACDFEB
C.BEFACD    D.BFDECA
5.(2024届嘉兴基测,12)待入栈的序列a有多种出栈序列,以下函数用于判断序列b是不是a的出栈序列,代码如下:
def judge(a,b):
n=len(a);st=[-1]*n
top=-1;i=j=0
while i top+=1
   ①  
 i+=1
 while top>-1 and   ②  :
  top-=1
  j+=1
return top==-1
from random import shuffle
a=[1,2,3,4,5]
b=[1,2,3,4,5]
shuffle(b)  #将序列b的元素随机排序
if judge(a,b):
  print(b,'是', a,'的出栈序列')
else:
  print(b,'不是',a,'的出栈序列')
程序运行结果如图所示。划线处应填写的语句是(  )
python 12.py
[2,5,4,3,1]是[1,2,3,4,5]的出栈序列
python 12.py
[5,2,3,1,4]不是[1,2,3,4,5]的出栈序列
A.①st[top]=a[i] ②st[top]==b[j]
B.①st[top]=a[i] ②st[-1]==b[j]
C.①st[top]=b[i] ②st[top]==a[j]
D.①st[top]=b[i] ②st[-1]==a[j]
6.(2022 Z20名校联盟,10)某算法利用“栈”思想进行字符串处理,其步骤如下:①创建长度为n的空栈,字符依次入栈;②当达到栈满状态或数据全部入栈时,字符依次出栈,按照出栈顺序连接成新字符串:③若还有未处理的字符,则重复步骤①②,直到全部字符处理完毕。实现该功能的 Python程序如下:
s=input("请输入字符串:")
n=5;st=[" "]*n
top=-1;i=0;m=" "
while i while  (1)  and i   (2) 
  st[top]=s[i]
  i+=1
 while top!=-1:
  m+=st[top]
   (3) 
print("密文:" ,m)
加框处(1)(2)(3)的代码由以下代码组成:
①top-=1 ②top+=1 ③top+1④top下列选项中代码顺序正确的是(  )
A.④②①    B.③①②
C.③②①    D.④①②
7.(2022诸暨海亮高中月考,10)有如下程序段:
bt=["A","B","C","D",None,"E","F"]
result=[]
stack=[]
i=0
while stack or (i  if i < len(bt) and bt[i] is not None:
    stack.append(i)
    i=2*i+1
  else:
    i=stack.pop()
    result.append(bt[i])
    i=2*i+2
print("-".join(result))
则程序运行后输出的结果为(  )
A.A-B-D-C-E-F    
B.D-B-E-F-C-A
C.D-B-A-E-C-F    
D.A-B-C-D-E-F
考点五 树
1.(2024届Z20联盟联考,8)某二叉树的树形结构如图所示,其后序遍历结果为“物技化数英语”,则中序遍历结果为(  )
A.语数英物化技    B.物数技化语英
C.语数物化技英    D.化物技英数语
2.(2022名校协作体,10)已知二叉树T2的后序遍历序列为G-D-H-E-B-I-F-C-A,中序遍历序列为D-G-B-E-H-A-C-I-F,则二叉树T2的前序遍历序列为(  )
A.A-B-D-G-E-H-C-I-F
B.A-B-D-G-E-H-C-F-I
C.A-B-D-G-E-H-F-C-I
D.该二叉树形态不唯一,无法确定
3.(2024届新阵地联盟第二次联考,8)某二叉树的树形结构如图所示,其后序遍历结果为FABGDEC,则中序遍历结果为(  )
A.FDAGBCE    B.FDABGEC
C.AGBDFCE    D.FDAGBEC
4.(2024届天域全国名校协作体联考,8)下列二叉树中,后序遍历结果不为CBFEAD的是(  )
  
  
5.(2024届七彩联盟联考,8)某二叉树用一维数组表示(见表)。该二叉树从根节点开始,按照从上到下,从左到右的顺序依次用A-H字母表示,该二叉树的中序遍历为(  )
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
A B C D E F G H
A.DBGEACFH    B.DBGEACHF
C.DBEGACHF    D.ABCDEFGH
考点六 大数据时代的数据的组织
1.下列关于实时查询数据系统中的数据结构的说法,不正确的是(  )
A.在实时查询系统中使用数组,时效性较差
B.在链表中查找数据时效性较高,插入数据时效性较低
C.跳跃表基于有序链表
D.跳跃表通过跨区间、跳跃性的比较,避免了依次比较,提高了效率
2.有如下跳跃表:
若要在原链表中插入元素7,则数据元素需要比较的次数为(  )
A.1   B.3   C.4   D.5
3.下列关于Hadoop的说法,不正确的是(  )
A.Hadoop是一种超大规模,高可靠性,高可扩展性的数据库
B.Hadoop是Google云计算技术的开源实现
C.使用Hadoop可以在POI数据的处理中获得更方便的体验和更低廉的成本
D.Hadoop可以对海量地理信息进行处理和计算
专题综合练
题组一
1.(2024届名校协作体联考,8)某二叉树的前序遍历结果为GFDECAB,中序遍历结果为DFGCAEB。关于该二叉树,以下说法正确的是(  )
A.该二叉树的后序遍历为ADFCBEG
B.该二叉树的深度为4,节点C在第3层
C.该二叉树的叶子节点数比非叶子节点数多一个
D.该二叉树可以通过添加3个节点后变为完全二叉树
2.(2024届强基联盟联考,8)某二叉树的树形结构如图所示,其后序遍历结果为FBCEAD,则前序遍历结果为(  )
A.ABCDEF    B.FEDCBA
C.DFACBE    D.FDBCAE
3.(2024届强基联盟统测,8)已知某二叉树的后序遍历为GDBEHFCA,中序遍历为DGBAECHF,下列说法正确的是(  )
A.该二叉树中叶子节点有3个
B.该二叉树的前序遍历为ABDGCEHF
C.该二叉树是一棵完全二叉树,树的高度为4
D.该二叉树中度为1的节点有2个
4.(2024届新阵地联盟第二次联考,9)栈S初始状态为空栈,将序列3,2,5,7,1中元素逐一入栈,当栈空或入栈元素比栈顶元素大时则入栈,否则出栈至符合条件再入栈。序列所有元素入栈完毕后,栈内剩余元素出栈,直至栈空。则出栈的顺序是(  )
A.17523    B.37521
C.37512    D.32751
5.(2024届天域全国名校协作体联考,9)利用栈求逆波兰表达式(表达式由操作数和运算符组成)的方法是:从左往右扫描该表达式,遇到操作数时入栈;遇到运算符时,把处于栈上方的两个元素依次出栈,用运算符计算,并把计算结果压入栈中。如此反复操作,直至表达式扫描结束。当用该算法求逆波兰表达式abcd-*e/+f-的值时(abcdef表示不同的操作数),所使用的栈的深度至少为(  )
A.3   B.4   C.5   D.6
6.(2024届嘉兴基测,11)长度为5的循环队列que,que[0]至que[4]的值依次为'a','b','c','d','e',执行如下程序段后,输出的最后一个字符为 (  )
n=5;head=0;tail=4
que=['a','b','c','d','e']
while head!=tail:
  if head%4==0:
   print(que[head])
  else:
   tail=(tai1+1)%n
   que[tail]=que[head]
  head=(head+1)%n
print(que[head])
A.b   B.c   C.d   D.e
7.(2024届发展共同体联考,9)某种特殊的队列Q,支持以下三个操作:
操作Q1:若队列非空,队首元素出队,并输出;
操作Q2:若队列非空,队首元素出队;
操作Q3:一个元素入队。
以上任意一种操作后,若队列非空,新的队首元素仍为队列中所有元素的最小值。
若队列Q初始状态为空,依次进行Q3、Q2、Q1、Q2、Q3、Q1、Q3七次操作后,下列说法正确的是(  )
A.当前队列中的元素个数为2
B.输出的元素个数为2
C.第一个输出的元素肯定比当前队首元素大
D.队列初始状态是不是空对输出结果有影响
8.(2024浙江1月选考,8,2分)栈S从栈底到栈顶的元素依次为1,2,3,队列Q 初始为空。约定:U 操作是指元素出栈后入队,H 操作是指元素出队后再入队。经过UUHU系列操作后,队列中队首到队尾的元素依次为(  )
A.2,1,3   B.3,1,2   C.1,3,2   D.2,3,1
9.(2024浙江1月选考,9,2分)数组元素a[0]至a[n-1]依次存放着n个数据,现需要将元素a[n-1]插入在下标为x(0≤xtemp=a[n-1]
for i in range(n-2,x-1,-1):
        
a[x]=temp
A.a[i+1]=a[i]    B.a[i-1]=a[i]
C.a[i]=a[i+1]    D.a[i]=a[i-1]
10.(2024届发展共同体联考,11)有如下程序段:
s=[' ']*len(a)
head=2;q=head;top=-1
while q!=-1:
  top+=1
  s[top]=a[q][0]
  q=a[q][1]
print(s[top-2])
若a=[['a',3],['b',0],['c',1],['d',-1]],则输出的结果为(  )
A.a   B.b   C.c   D.d
11.(2024届强基联盟联考,11)有如下Python程序段:
s=input()
stack=[0]* len(s);top=-1;presign='+';num=0
for i in range(len(s)):
if '0'<=s[i]<='9':
  num=num*10+int(s[i])
if i==len(s)-1 or s[i] in '+-*/':
  if presign=='+':
    top+=1
    stack[top]=num
  elif presign=='-':
    top+=1
    stack[top]=-num
  elif presign=='*':
    top+=1
    stack[top]=stack[top-1]*num
  else:
    top+=1
    stack[top]=stack[top-1]
//num
  presign=s[i]
  num=0
print(sum(stack))  #sum函数对stack中所有元素求和
若输入'5*4-6+10/3',程序运行后,输出的结果是(  )
A.32   B.24   C.17   D.8
12.(2023浙江1月选考,15,9分)有2组器件共n个,要用一台检测设备检测。每个送检器件的信息包含送达时间、检测时长和优先级。优先级有m(1编写程序模拟检测过程,先合并2组器件的数据,然后计算所有器件的平均等待时长,其中每个器件等待时长为其开始检测时间与送达时间的时间差。(时间单位均为秒)
请回答下列问题:
(1)由题意可知,图中器件A、B、C、D的检测顺序为A—C—D—B,A、C、D的等待时长分别为0、1、0,B的等待时长是    。
送达时间 检测时长 优先级
A 0 3 2
B 1 1 2
C 2 1 1
D 4 3 0
11 3 2
12 2 2
(2)定义如下merge(lst1, lst2)函数,参数 lst1和 lst2的每个元素由送达时间、检测时长和优先级3项构成,lst1和 lst2均已按送达时间升序排列。函数功能是将lst2中的元素合并到lst1中,并将 lst1按送达时间升序排列,函数返回lst1。
def merge(lst1,lst2):
  i=len(lst1)-1
  j=len(lst2)-1
  for t in range(len(lst2)):
   lst1.append([0,0,0])  #为lst1追加一个元素[0,0,0]
  k=len(lst1) -1
while j >=0:
   if i >=0 and lst1[i][0]>lst2[j][0]:
  lst1[k]=lst1[i]
i -=1
   else:
lst1[k]=lst2[j]
j -=1
   k -=1
 return lst1
①调用merge(lst1,lst2)函数,若lst1为[[0,3,2],[1,1,2],[12,2,2]],lst2为[[2,1,1],[4,3,0], [11,3,2]],则while语句中循环体的执行次数是    。
②若函数中 while语句的条件“j>=0”误写为“k>=0”,会导致某些情况下无法得到符合函数功能的结果。调用merge(lst1, lst2)函数,下列4组数据中能测试出这一问题的是    (单选,填字母)。
A.lst1=[[0,3,2],[4,3,0]]
lst2=[[1,1,2]]
B.lst1=[[1,1,2]]
lst2=[[0,3,2],[4,3,0]]
C.lst1=[[1,1,2],[4,3,0]]
lst2=[[0,3,2]]
D.lst1=[[4,3,0]]
lst2=[[0,3,2],[1,1,2]]
(3)实现模拟检测过程并计算平均等待时长的部分Python程序如下,请在划线处填入合适的代码。
def proc(data,m):
  n=len(data)
  queinfo=[]
  for i in range(m):
   queinfo.append([-1, -1])
# queinfo追加一个元素[-1,-1]
  for i in range(n):
data[i].append(-1)  # data[i]追加一个元素-1
  curtime=0
waitnum=0
i=0
  ①  
while i < n or waitnum > 0:
  if i < n and data[i][0] <=
curtime:
   k=data[i][2]
   if queinfo[k][0]==-1:
     queinfo[k][0]=i
   else:
       ②  
     data[p][3]=i
   queinfo[k][1]=i
   waitnum+=1
   i+=1
  elif waitnum >0:
k=0
while queinfo[k][0]==-1:
  k+=1
p=queinfo[k][0]
total+=curtime-data[p][0]
curtime+=data[p][1]
  ③  
waitnum -=1
  else:
    curtime=data[i][0]
return total / n
'''
读取2组器件的数据,分别存入列表data1和 data2中。2个列表的每个元素包含3个数据项,分别对应器件的送达时间、检测时长和优先级。data1和 data2中的数据已分别按送达时间升序排列,代码略
读取优先级等级个数存入m,代码略
'''
data=merge(data1, data2)
print(proc(data, m))
13.(2023浙江6月选考,15,9分)某工程包含n个任务(编号为0~n-1),每天可以有多个任务同时进行。某些任务之间有依赖关系,如图a所示,任务4依赖于任务1,任务1依赖于任务2。即任务2完成后才可以开始任务1,任务1完成后才可以开始任务4。不存在一个任务依赖于多个任务,或多个任务依赖于同一个任务的情况。
现已对该工程的依赖关系进行了梳理,结果如图b所示,标记“T”表示依赖关系需保留,标记“F”表示依赖关系需删除。
根据每个任务完成所需的天数和梳理后的依赖关系,编写程序,首先删除标记为“F”的依赖关系,然后计算工程最快完成所需的天数,并以工程最快完成所需的天数为期限,计算每个任务最晚必须开始的时间。
任务A 任务B 标记
0 5 T
5 4 F
4 1 T
1 2 T
2 3 F
注:任务A依赖于任务B
图b
请回答下列问题:
(1)若某工程有6个任务,任务间依赖关系如图a所示,完成任务0~5所需天数分别为2,1,3,5,1,6,则工程最快完成需要  天。
(2)定义如下erase(lst)函数,参数 lst列表的每个元素表示一个依赖关系。函数的功能是删除标记为“F”的依赖关系,返回保留的依赖关系的个数。
def erase(lst):
  i=0
  j=len(lst)-1
  while i<=j:
    if lst[i][2]=='T':
      i+=1
    else:
      if lst[j][2]=='T':
lst[i]=lst[j]
i+=1
      j-=1
  return i
若lst列表依次存储图b所示的依赖关系,如 lst[0]为[0,5,'T'],调用erase(lst)函数,则语句“lst[i]=lst[j]”的执行次数为  。
(3)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
def proc(n,lst,task):
pr=[0]*n
w=[0]* n  # w[i]存放任务最晚必须开始的时间
m=erase(lst)
for i in   ①  :
task[lst[i][1]][1]=lst[i][0]
pr[lst[i][0]]=1
c=[]
days=0  # days存放工程最快完成所需的天数
for i in range(n):
if pr[i]==0:
  k=i
  s=0
  while k!=-1:
    c.append(k)
    s+=task[k][0]
      ②  
  if s > days:
    days=s
for i in range(n-1,-1,-1):
k=c[i]
if task[k][1]==-1:
  w[k]=days-task[k][0]+1
else:
    ③  
#输出days,以及保存在w中的每个任务最晚必须开始的时间,代码略
"'
工程包含的任务数存入变量n
任务间的依赖关系存入lst列表
lst[0]包含3项,任务lst[i][0]依赖于任务lst[i][1],lst[i][2]存放保留/删除标记,任务数据存入task列表
task[i]包含2项,task[i][0]为完成任务所需天数,task[i][1]的初值为-1
代码略
"'
proc(n,lst,task)
14.(2024届Z20联盟联考,15)小明同学去看病,当他在一位医生的诊室门口等待就诊的时候,发现了叫号系统的页面上有两行病人名单。第一行名单为正常排队等待就诊的序号,第二行名单为过号或检后再诊而等待的序号。叫号的规则是先在第一行叫2个就诊序号,再到第二行叫1个就诊序号。小明同学回家后将刚才发现的叫号规则编写了Python程序。效果如图所示:
图①:当前到来的就诊序号是3号,为过号或检后再诊序号,进入第二行,先到达先就诊。
图②:当前到来的就诊序号是4号,为过号或检后再诊序号,进入第二行。
图③:当前到来的就诊序号是16号,为正常排队等待就诊的序号,进入第一行,按就诊序号顺序排列。
图④:开始叫号,按照正常排队等待就诊叫号2位,过号或检后再诊叫号1位,得到新的顺序。
(1)请在划线处填入合适的代码。
(2)加框处的代码有误,请改正。
def output(head, a, b):
p=head
head_b=0; tail_b=len(b)
while p!=-1:
  print(a[p][0], end="->")
  p=a[p][1]
print()
while head_b!=tail_b:
  print(b[head_b], end="->")
  head_b+=1
print()
def insert(data,a,b):  #根据挂号的序号分别进入第一行名单或第二行名单
  head_a=a[0][0]
  if data>  ①  :
   p=0
   a.append([data,-1])
   while p!=-1:
     if data<=a[p][0]:
       a[-1][1]=p
       a[q][1]=len(a)-1
       break
     else:
       q=p
       p=  ②  
   if p==-1:
     a[q][1]=  ③  
   output(0,a,b)
  else:
   b.append(data)
   output(0,a,b)
#a、b赋初值,代码略
#如图①所示:a=[[13,1],[15,2],[17,-1]];b=[3]
while True:
  data=int(input("请输入取号:"))
#输入0表示停止取号,开始叫号
  if data==0:
   break
  insert(data,a,b)
print("====开始叫号====")
p=head=0
head_b=0;tail_b=len(b)
while p!=-1 or head_b!=tail_b:
  if p!=-1 and head_b!=tail_b:
    i=0
    while a[p][1]!=-1:
     print(a[p][0], end="->")
     p=a[p][1]
     i+=1
    print(  ④  , end="->")
    head_b+=1
  elif p!=-1 and head_b==tail_b:
    print(a[p][0], end="->")
    p=a[p][1]
  else:
    print(b[head_b], end="->")
    head_b+=1
15.(2022山水联盟开学考,15)小赵同学在某游戏平台中获得虚拟的食物、装备、材料等物品,它们分别有不同的价值,现游戏平台有兑换机制,即可用多个不同物品换取一个等值的物品(每个物品只能取一样),下表为小赵同学已获得的物品。
序号 物品名称 数量 单价
0 灵丹 2 1
1 大力丸 1 2
2 止血草 3 5
3 忘魂花 1 7
4 雄黄 1 9
5 灵山仙芝 5 10
6 梅花镖 1 15
7 止血草 1 20
目标置换物品的价值:35。
已获得物品价值依次是:1,2,5,7,9,10,15,20。
依次拿取物品序号的方案有:
取序号为[0,1,2,3,7]的物品;
取序号为[0,1,3,5,6]的物品;
取序号为[0,2,4,7]的物品;
取序号为[0,4,5,6]的物品;
取序号为[2,5,7]的物品;
取序号为[6,7]的物品。
如要换取游戏中的物品“破天锤”,需要35个金币,有多种置换的方式,为方便计算以节省时间,小赵同学编写了如下程序,运行界面和代码如下,请在划线处填入合适的代码。
def exchange(t,pricelist):
  n=len(pricelist)
  stack=[]
  i=0
  num=0
  while   ①   :
    while t>0 and i      if t>=int(pricelist[i]):
stack.append(i)
  ②  
      i+=1
      if t==0:
       print("取序号为",stack,"的物品")
num+=1
    if    ③   :
      i=stack.pop()
      t+=int(pricelist[i])
      ④   
  if num==0:
    print("无方案")
m=int(input("目标置换物品的价值:"))
price=input("已获得物品价值依次是:")
p=price.split(",") #将输入的内容以“,”作分隔,并转换为列表
print("依次拿取物品序号的方案有:")
exchange(m, p)
16.(2022名校协作体联考,15)某校军训,需要按照身高由低到高排成n行5列的方阵。某班学生按照身高(100≤身高<199)由低到高编写编号并将相关信息存在图1所示的“stu.txt”文件中。根据教官提出的排方阵要求,排成如图2所示的方阵,方阵各点显示学生编号。
 
现有延迟报到学生归队,归队学生编号延续该班现有编号依次往后,编写程序完成下列任务:输入学生身高,输出新的方阵布局图。例如:输入学生身高为168,新的方阵布局图如图3所示,学生在方阵的位置:3,4。
(1)若插入学生身高为160 cm,根据图1及范例,该学生应该在图2方阵中的   行    列。
(2)为实现上述功能,请填写划线处代码。
f=open("stu.txt","r")
a=[]
line=f.readline().split()
i=1
while line!=[]:
  a.append([line[0],line[1], i])
  i+=1
  line=f.readline().split()
n=len(a)-1
a[n][2]=-1
sg=input("请输入插入的学生身高(cm):")
xh=str(len(a))
head=1
p=head;q=head
while   ①  :
  p=q
  q=a[q][2]
if q==head:
    ②  
  head=len(a) -1
else:
  a.append([xh,sg,a[p][2]])
  a[p][2]=len(a)-1
p=head
m=1
while p!=-1:
  if m!=5:
    print(a[p][0],end=" ")
    m+=1
  else:
    print(a[p][0])
    m=1
      ③  
17.(2022 A9协作体返校考,15)学校举办了“语文作文现场赛”,参赛同学成绩存储在文本文件“gra.txt”中,如图a所示(每一行记录一位同学的姓名和成绩,以“:”分隔)。陈老师利用Python程序对作文成绩进行处理,统计出各个分数等级的人数,并输出结果。程序运行界面如图b所示。
实现上述功能的Python程序如下,请在划线处填入合适的代码。
def cla(x): #判断成绩等级
  if x>=50:
   return "A"
  elif x>=40:
   return "B"
  elif x>=30:
   return "C"
  else:
   return "D"
gra=[] #存储各个整数型成绩
num=[0]*4
f=open("gra.txt")
lines=f.readlines() #将f对象的数据按行存入列表lines中
f.close() #关闭文件
for line in lines: #循环读取列表lines 中的每个元素,并做相应处理
  a=line.strip().split(":") #去除结尾的换行符并以冒号为分隔符进行分隔
  gra.append(  ①  )
for i in range(len(gra)): #统计各等级人数
  t=  ②  
  num[ord(t)-65]+=1
print("成绩分布如下: ")
for i in range(len(num)): #输出统计结果
  print(chr(i+65)+"等级有"+ ③ +"人")
18.(2023七彩阳光开学考,15)食堂推出的三款特色菜,分别用A、B、C表示,想用投票方式统计出三款菜的受欢迎程度。每位投票者需要将三款菜按喜爱程度从高到低进行排列,并投出一票。如图a所示,小明负责将文件“投票.txt”中的选票进行统计。第1张选票信息为“A,C,B”,表示投票者认为A菜优于C菜,C菜优于B菜,即A菜也优于B菜。他得到如图b所示的投票情况。对选票进行统计,得到三款菜的偏好,如图c所示,数据第一行中的“6”说明有6张选票显示A菜优于B菜,“10”说明有10张选票显示A菜优于C菜,以此类推……将所有投票进行统计,再将三款菜的得票数进行求和,按得票数从高到低排列,分别为A菜16票,B菜11票,C菜12票,即可得到每款菜的受欢迎程度。
    
    
请回答下列问题:
(1)若有四款菜,投票情况如图d所示,则第2受欢迎的菜为    (填字母)菜。
(2)加框处代码有错误,请改正。
(3)实现上述功能的 Python程序如下,请在划线①②③处填入合适的代码。
f=open('投票.txt')
a=[]
r=f.readline().strip() #从文件中读取一行,并把末尾的'\n'删掉
while r: #当r非空(从文件读取到了数据)
  a=r.split(',')
  r=f.readline().strip()
f.close()
n=len(a[0])
p=[0]*n**2
for i in a:
  for j in range(n-1):
    x1=ord(i[j])-65
    for k in range(  ①  ):
      x2=ord(i[k])-65
  ②  
b=[[' ',0]for i in range(n)]
for i in range(n):
  b[i][0]=chr(i+65)
  for j in range(n):
    b[i][1]+=p[i*n+j]
i=1
while i  x=b[i]
  j=i-1
  while   ③  :
    b[j+1]=b[j]
    j-=1
  b[j+1]=x
  i+=1
for i in range(n):
  print('第',i+1,'受欢迎的菜为',b[i][0],',得票为',b[i][1],'票')
题组二
1.(2024届百校起点调研测试,8)某二叉树的中序遍历为ABCDEF,则下列不可能是此二叉树的是(  )
   
   
2.(2024届发展共同体联考,8)某二叉树的树形结构如图所示,其前序遍历结果为BADCFGE,则字符“G”所在的位置为(  )
A.①   B.②   C.③   D.④
3.(2024届浙南名校联盟联考,8)有一棵二叉树如图所示,下列说法正确的是(  )
A.此二叉树是完全二叉树
B.此二叉树的叶子节点有3个
C.此二叉树的后序遍历为FDBECA
D.此二叉树用一维数组表示为['A','B','C','D','E','F']
4.(2024届名校协作体联考,9)有一组数据4,2,6,3,1,5按序入栈,则出栈的顺序可能是(  )
A.4,2,5,3,1,6    B.1,3,5,2,6,4
C.6,4,2,3,5,1    D.6,2,4,3,1,5
5.(2024届强基联盟联考,11)执行下列Python程序代码,若输入的数据为"ABCDE",则输出的结果不可能是(  )
from random import randint
st=[' ']* 10;top=-1;out=' '
s=input('s=')
while s:
  flag=randint(0,1)
  if flag==1:
    top+=1;st[top]=s[0]
    s=s[1:]
  elif top !=-1:
    out+=st[top];top-=1
while top !=-1:
  out+=st[top]; top-=1
print(out)
A.CEDAB    B.BDECA
C.ABCED    D.DCBEA
6.(2024届百校起点调研测试,11)有如下Python程序:
q=[0]* 6
q[0]=1
head=0;tail=1
while tail  x=q[head]
  if x%2==0:
    q[tail]=x//2
    tail+=1
  else:
    q[tail]=x*2
    q[tail+1]=x*3
    tail+=2
  head+=1
程序运行后, tail-head的值为(  )
A.3   B.4   C.5   D.6
7.(2024届浙南名校联盟联考,9)下列关于队列和栈的说法,不正确的是(  )
A.队列是一种先进先出的线性表,可在队尾进行插入操作
B.栈的特性是“先进后出,后进先出”
C.某栈的入栈的顺序为abc,出栈顺序只有3种
D.队列和栈都是线性数据结构,都可以用数组来实现
8.(2024届浙南名校联盟联考,11)已知字符"a"的ASCII码值为97,有如下Python程序段:
que=[" "]*20
head,tail=0,0
for i in range(3):
que[tail]=chr(97+i)
tail+=1
st=["b" ,"c" ,"d" ,"a"]
top=3
while head < tail and top >-1:
  if st[top]==que[head]:
    head+=1
  else:
    que[tail]=st[top]
    tail+=1
  top-=1
print(que[head:tail])
执行该程序段,则输出的结果是(  )
A.['c', 'd', 'c']    B.['c', 'c', 'd']
C.['c', ' ', 'd']    D.['c', 'd']
9.(2024届强基联盟统测,12)有如下Python程序段:
a=[i for i in range(1,7)]
b=[0]*6
head,tail=0,0
for i in range(1,7):
cnt=1
while cnta[tail]=a[head]
head=(head+1)%6
tail=(tail+1)%6
cnt+=1
b[a[head]-1]=i
head=(head+1)%6
执行该程序段后,b[5]的值为(  )
A.2   B.3   C.4   D.5
10.(2024浙江1月选考,12,2分)使用列表d模拟链表结构(节点数大于0),每个节点包含数据区域和指针区域, h为头指针。链表中各节点已按数据区域中数值的绝对值由小到大排列,如图a所示。现要修改该链表各节点的链接关系,使链表各节点按数据区域中的数值由小到大排列,结果如图b所示。实现该功能的程序段如下,方框中应填入的正确代码为(  )
  
t=h
p=d[h][1]
while p !=-1:
q=d[p][1]
     
p=q
d[t][1]=-1
A.
if d[p][0]>0:
  d[q][1]=p
  d[t][1]=q
else:
  d[h][1]=q
  h=p
 B.
if d[p][0]>0:
  d[t][1]=q
  t=q
else:
  h=p
  d[p][1]=t
C.
if d[p][0]>0:
  d[t][1]=p
  t=p
else:
  d[p][1]=h
  h=p
 D.
if d[p][0]>0:
  d[t][1]=q
  d[q][1]=p
else:
  d[p][1]=h
  h=q
11.(2024届嘉兴基测,15)最短路径问题。以m*n个边长为1的正方形组成的矩形,各顶点按行优先从0开始编号,图a所示为3*2的矩形及顶点编号。从顶点x(起点)经由各正方形的边移动到顶点y(终点)有多种移动路径,编程求解所有的最短路径。
(1)分析问题,将矩形转换为计算机可处理的数据。可采用列表存储矩形中各顶点的相邻关系,如图b所示。
顶点 相邻顶点
0 [4,1]
1 [5,0,2]
2 [6,1,3]
3 [7,2]
4 [0,8,5]
...
图b
编写函数init,根据横向和纵向的正方形数量,返回所有顶点及其所有的相邻顶点数据。完善程序,在划线处填入合适的代码。
def init(m, n):
tot=(m+1)*(n+1)#顶点总数
lst=[[]for i in range(tot)]
for i in range(tot):
if i > m:
 lst[i].append(i-m-1)
if i < (m+1)*n:
 lst[i].append(i+m+1)
if i%(m+1) !=0:
 lst[i].append(i-1)
if i%(m+1)!=m:
         
return lst
(2)分析问题,查找所有从起点到终点的最短路径。例如:查找从起点1到终点10的所有最短路径,可先查找终点10的所有相邻顶点(6,9,11),然后再逐个查找顶点6、9、11的相邻顶点,直到查找到起点1,获得所有最短路径,如图c所示,共有3条长度为3的最短路径,分别为1→2→6→10,1→5→6→10,1→5→9→10。若从起点4到终点11,共有    条最短路径。
(3)分析问题,存储查询到的路径。可采用链表结构保存路径数据,例如:查找从起点1到终点10的所有最短路径,首先将终点10的数据[10,0,-1]保存在path[0]中,然后将其相邻顶点6、9、11 的数据保存到path中,path[i][0]保存顶点的编号,path[i][1]保存当前顶点到终点的距离,path[i][2]保存下一顶点在path中的位置,其值为-1表示当前顶点为终点。
编写函数print_path,输出所有的最短路径。完善程序,在划线处填入合适的代码。
def print_path(x,path,length):#为起点编号,length为path中有效元素个数
 cnt=0
for i in range(length):
if path[i][0]==x:
   cnt+=1
   s="最短路径"+ str(cnt)+ " :"
   v=path[i]
   while       :
     s=s+ str(v[0])+ ","
     v=path[v[2]]
   s=s+ str(v[0])+ "。"
   print(s)
(4)实现上述功能的Python程序如下,运行结果如图d所示。请在划线处填入合适的代码。
请输入起点:0
请输入终点:10
最短路径1:0,1,2,6,10。
最短路径2:0,1,5,6,10。
最短路径3:0,4,5,6,10。
最短路径4:0,1,5,9,10。
最短路径5:0,4,5,9,10。
最短路径6:0,4,8,9,10。
图d
m=3#横向正方形数量
n=2#纵向正方形数量
mtx=init(m, n)
x=int(input("请输入起点:"))
y=int(input("请输入终点:"))
path=[[]for i in range(999)]
passed=[False]* len(mtx)  #保存顶点是否已途经
  ①  
dis=0;head=0;tail=0
path[tail]=[y,0,-1]
tail+=1
passed[y]=True
while not found:
  dis+=1
  pass_dis=[False]* len(mtx)
  tmp=tail
  for i in range(head,tail):
v=path[i]
for d in mtx[v[0]]:
if not passed[d]:
  path[tail]=  ②  
  tail+=1
  pass_dis[d]=True
if d==x:
  found=True
  head=tmp
  for i in range(len(mtx)):  #标记已途经的顶点
    if   ③  :
     passed[i]=True
#输出结果
print_path(x, path,tail)
12.(2022 A9协作体返校考,16)字符串分段。输入一串仅由小写字母组成的字符串s,将这个字符串划分为尽可能多的小片段,要求同一个字母只出现在其中的一个片段中,并按照分段顺序逐行输出分段结果。程序运行界面如下:
请输入一串仅包含小写字母的字符串:asdasmhjhh
asdas
m
hjhh
(1)实现上述功能的Python程序如下,请在划线处填入合适的代码。
s=input("请输入一串仅包含小写字母的字符串:")
c=0
p=[-1]*52 #数组p用来记录各个小写字母出现的起始位置和结束位置
#a[0]记录a出现的起始位置,a[1]记录a出现的结束位置,依此类推
for i in range(0,len(s)): #记录各字符第一次和最后一次出现的位置
  a=  ①  
  if p[2*a]==-1:
   p[2*a]=i
  else:
   p[2*a+1]=i
for i in range(0,26):
  if p[2*i]>p[2*i+1]:
   p[2*i+1]=p[2*i] #只出现一次的字符,起始位置就是结束位置
  if p[2*i]!=-1:
    c+=1
for i in range(0,c): #将字符位置按照出现的起始位置升序排序
  for j in range (25, i,-1):
   if p[2*j]> -1:
     if p[2*(j-1)]> p[2*j]or   ②  :
     p[2*(j-1)],p[2*j]=p[2*j],p[2*(j-1)]
      p[2*(j-1)+1],p[2*j+1]=p[2*j+1],p[2*(j-1)+1]
t1,t2=p[0],p[1] #字符串分段
for i in range(1, c):
  if p[2*i]< t2 and p[2*i+1]> t2:
      ③  
  elif p[2*i]>t2:
    print(s[t1:t2+1])
    t1,t2=p[2*i], p[2*i+1]
print(s[t1:t2+1])
(2)运行程序后,若输入的字符串s为"hshjhqueeqabaa",输出的结果一共  行,其中第二行显示结果为    。
答案 (1)①ord(s[i])-97 或ord(s[i])-ord("a")
②p[2*(j-1)]==-1 ③t2=p[2*i+1] (2)3;queeq
13.(2022 Z20名校联盟联考,15)校学生会要从两个候选人A和B中选举一个会长,每个候选人都有自己的支持方。现在以轮为过程来进行选举,在每一轮选举中,当前成员可以禁止另一位成员的选举权,即让另一位成员在这一轮和随后的几轮中都丧失选举权。
在选举过程中,一旦有选举权的成员都来自同一个阵营,则该阵营胜利。
字母A和B分别代表两位候选人,输入一个字符串代表每个成员的阵营,例如输入“ABB”,则输出结果为B,即候选人B为会长。
说明:第一轮中,第一个成员(A)可以让第二个成员(B)失去选举权,第二个成员(B)会被跳过,因为他的选举权被禁止,第三个成员(B)可以让第一个成员(A)失去选举权,因此在第二轮只剩下第三个成员(B)拥有选举权,则输出结果为B,即候选人B为会长。
(1)若输入“ABABB”,则会长为    。
(2)实现上述功能的Python程序如下,请在划线处填入合适的代码。
s=input("请输入投票字符串:")
queA=[" "]*100 ; queB=[" "]*100
headA=headB=0
tailA=tailB=0
n=len(s)
for i in range(n):
  if  ①  :
    queA[tailA]=i
    tailA+=1
  else:
    queB[tailB]=i
    tailB+=1
while   ②  :
  if queA[headA]    queA[tailA]=queA[headA]+n
    tailA+=1
  else:
    queB[tailB]=queB[headB]+n
    tailB+=1
  headA+=1; headB+=1
if  ③  :
  print("B")
else:
  print("A")
14.(2022 Z20名校联盟联考,16)“最小波动值”是经济管理学上的一种衡量营业情况是否稳定的概念,当“最小波动值”越大时,就说明营业情况越不稳定。
经济管理学上对“最小波动值”的定义:
某一天的“最小波动值”=min{|该天以前某一天的营业额-该天营业额|},第一天的“最小波动值”为第一天的营业额。
若要分析某个店铺的营业情况是否稳定,只需要把一段时间内每一天的“最小波动值”加起来即可。现根据某个店铺一段时间内每一天的营业额(说明:支出为0表示该天不营业),设计程序计算该店铺的“最小波动值”之和。
(1)若营业额数据为“13,10,14,15,3,11”,则“最小波动值”之和是    。
(2)实现上述功能的Python程序如下,请在划线处填入合适的代码。
import pandas as pd
num=[] #数组num按经营时间顺序存储每天营业额
numy=[] #数组numy按营业额降序存储每天营业额
item=[] #根据数组numy构造链表item
df=pd.read_excel("yye.xlsx")
df=  ①   #筛选出营业的记录
df["营业额"]=df.sum(axis=1) #在df对象最后一列插入“营业额”列
df1=df.sort_values("营业额",ascending=False)
for i in df.index:
  num.append(df["营业额"][i])
for i in df1.index:
  numy.append(df["营业额"][i])
n=1
for i in numy:
  item.append([i,n])
  n+=1
item[n-2][1]=-1
head=0
k=0
  ②  
for i in num[-1 :-len(num):-1]:
  p=head
while item[p][0]!=i:
  k=p
  p=item[p][1]
f=item[p][1]
if f==-1:
  tot+=abs(item[k][0]-item[p][0])
elif p==head:
  tot+=abs(item[f][0]-item[p][0])
else:
  tot+=min(abs(item[k][0]-item[p][0]) , abs(item[f][0]-item[p][0]))
if p==head:
  head=item[head][1]
else:
    ③  
print("该店铺的最小波动值之和是",tot)
15.(2023“山水联盟”开学考,16)临近年关,学校为活跃新年气氛,举办迎新年联欢活动,最后一个节目为“我是大赢家”抽奖活动,为增强互动效果,最后中大奖的中奖者由教师们互动产生,游戏规则是:全校所有教工,每人获得一个随机编号,编号不得重复,然后按照编号大小顺时针手拉手围成一个圈,最后一个老师与第一个老师手拉手,接下来由第1个人指定m的值,从编号为1的人开始报数(1,2,3,…),报到m的人出圈,不再参加互动游戏,接着再由出圈人的上一位老师新指定m的值,并重新开始报数,逆时针报到m的人出列,游戏过程中出圈的人由老师们自己决定,如此继续,顺时针出圈一个人,逆时针出圈一个人,直到圈中只剩下一个人,他就是今天的最大赢家。小明编写了一个Python程序实现上述功能,程序运行时,输入参加游戏的人数,每次有人出圈后,再输入下一个指定值。
实现上述功能的Python程序如下,请在划线处输入合适的代码。
#删除索引为p的游戏者
def delete(a,head,p):
if a[p][1]!=-1:
  a[a[p][1]][2]=a[p][2]
if a[p][2]!=-1:
    ①  
if head==p:
  head=a[head][2]
return head
n=int(input("请输入参加游戏的人数"))
a=[[i+1,i-1,i+1]for i in range(n)]
a[0][1]=n-1
a[n-1][2]=0
p=head=0
while   ②  :
  m=int(input("请输入顺时针数第几位出局"))
  for i in range(m-1):
      ③  
  head=delete(a,head,p)
  p=a[p][1] #退回到上一位游戏者
  if a[head][1]!=head:
    m=int(input("请输入逆时针数第几位出局"))
    for i in range(m-1):
      p=a[p][1]
    head=delete(a,head,p)
      ④   #退回到上一位游戏者
print(a[head])
16.(2023强基联盟统测,16)某银行网点有5个窗口,银行最少要保持3个窗口营业,另2个窗口初始为备用状态。客户按批次进入大厅,每个客户的业务办理时间为1个单位,银行每过1个时间单位就允许下一批客户进入。对于进入银行的客户,如果某窗口正空闲,则可上前办理业务,反之,若所有窗口均有客户,他便会排在最短的队伍后面。当平均每个营业窗口前的队伍人数大于等于7人时(队伍包括正在办理业务的客户在内),银行可临时将备用窗口中一个或两个改为营业窗口,当所有窗口平均客户少于7人时,将立即停用一个营业窗口转为备用,窗口平均人数若继续减少至以上情况,可再停止一个营业窗口,但最多只能有两个窗口为备用状态。
现模拟该银行排队程序,效果如图所示,输出10个人各自的等待时间单位:
请输入共有多少批客户:2
输入每一批的人数4,6
(1:0)(2:0)(3:0)(4:1)(5:0)(6:0)
(7:1)(8:1)(9:1)(10:2)
输出格式描述:(客户编号:等待的时间)
(1)实现上述功能的Python程序如下,请在划线处填入合适的代码。
mins=3 #常用窗口3个
maxs=5 #最多可开设5个窗口
lims=7 #正常服务时每个窗口平均等待的最多人数
tm=int(input('请输入共有多少批客户:'))
ps=list(map(int,input('输入每一批的人数').split(',')))
sw=mins
if len(ps)!=tm:
print('输入有误!')
pid,cnt=0,0
head,tail=0,0
qe=[[0,0]]*1000 #创建等待队列
def updatetime(s):
for j in range(len(s)):
s[j][1]+=1
for i in range(tm):
for j in range(sw): #将轮到的人进行出队
  if ① :
 print(f'({qe[head][0]} :{qe[head][1]})',end='')
head+=l
cnt-=1
#人数减少后,检查人数和窗口数是否符合要求并按照要求减少窗口,代码略
if head!=tail:
 ② #更新等待队列里每个人的等待时间
for j in range(ps[i]):
pid+=1
qe[tail]=[pid,0]
tail+=1
cnt+=1
while ③ :
sw+=1
while cnt>0 :
#最后一批人进入银行后,程序只需要处理等待队列剩余人员到出队和窗口的减少,直至人数为0,代码略
(2)共有3批客户,分别为22人,23人,21人,则输出结果中,第4个人等待的时间单位是    。
17.(2022浙北G2联盟期中,16)小明来到探险岛寻宝,岛上共有N个宝藏(标号为0至N-1)。每个宝藏有一条路连接下一个宝藏,宝藏号和下一个宝藏号使用链表存储。小明想知道,从其中一个宝藏出发,最多可以找到多少个宝藏。
例如,共有5个宝藏,输入“1,3,4,4,1,”表示0~4各宝藏点连接的下一个宝藏依次是:1,3,4,4,1(如下表)。则最多可以找到4个宝藏,路径为:0号→1号→3号→4号。
宝藏号 0 1 2 3 4
下一个宝藏号 1 3 4 4 1
程序代码如下:
s=input("请输入宝藏连接的情况:")
t=0;c=" ";a=[]
for i in s:
 if i!=",":
  c+=i
 else:
  a.append([t,int(c)])
  c=" "
     ①   
max=0
for head in range(0,t):  #枚举寻找宝藏起点
 g=[]
 p=head
 while p not in g:
  g.append(p)
     ②   
 if len(g)>max:
     ③   
print(max)
(1)若有4个宝藏,且每个宝藏的连接情况为:2,0,0,1,那么小明最多可以挖到的宝藏数是    。
(2)请将代码补充完整。
专题七 数据的组织
考点过关练
考点一 数组
1.(2022浙北G2联盟期中,15)有如下Python 程序段:
import random
a=[]
for i in range(10):
    a.append(random.randint(1,100))
i=0
while i <10:
    if i==0:
      i=i+1
    elif a[i-1]<=a[i]:
         ①   
    else:
      a[i],a[i-1]=a[i-1],a[i]
         ②   
print(a)
执行该程序段实现了随机生成一个数组,并将其元素递增输出的功能。划线处的代码应该是(  )
A.① i+=1 ② i=1
B.① i-=1 ② i=1
C.① i+=1 ② i+=1
D.① i-=1 ② i-=1
答案 A 
2.(2022绍兴诸暨期中,3)使用列表生成的方式创建数组代码如下:
a=[i*i-1 for i in range(10) if i%2==0]
则数组元素a[3]的值为(  )
A.2   B. 8   C. 15   D. 35
答案 D 
3.(2022绍兴诸暨期中,4)设有一个5×8的二维数组a,若按行优先的顺序存储数组元素,则元素a[3][5]前面元素的个数为(  )
A.21   B. 22   C. 29   D. 37
答案 C 
4.(2022绍兴诸暨期中,13)有如下Python程序段:
a=[[0 for i in range(3)]for j in range(3)]
for i in range(3):
 for j in range(3):
  a[i][j]=i*5+j+1
for i in range(1,3):
 for j in range(2):
  print(a[j][i],end=" ")
程序段执行后,输出的结果是(  )
A.2 3 7 8    B.7 12 8 13
C.2 7 3 8    D.6 7 11 12
答案 C 
5.(2022杭州期中,10)下述代码段用于实现在数组a中将新数据k插入下标为 j(0<=j<=8)的位置:
a=[8,6,12,3,5,7,11,2,10,0]
i=8
while i>=j:
    (1)  
    (2)  
  (3)  
横线处的代码由以下五部分中的三部分组成:
①a[i+1]=k ②a[i]=k ③a[i+1]=a[i]
④a[i]=a[i-1] ⑤i=i-1
下列选项中代码选择与顺序正确的是(  )
A.③⑤②   B.⑤③①   C.③⑤①   D.④⑤②
答案 C 
6.(2022嘉兴期中,3)用 Python 程序段定义一个3行4列的二维数组(要求先将各元素的值初始化为0,再将第2行第 2 个元素重新赋值为1),以下程序段可行的是(  )
A. arr=[[0]*3 for j in range(4)]
arr[2][2]=1
B.arr=[[0]*4]*3
arr[1][1]=1
C.arr=[[0 for i in range(4)]for j in range(3)]
arr[1][1]=1
D.arr=[[0,0,0,0]for j in range(3)]
arr[2][2]=1
答案 C 
考点二 链表
1.(2022浙南名校联盟期末,12)一个头指针 head=2 的单向链表 L=[[30,4], [10,-1], [20,0], [15,1],[21,3]]通过以下 Python 程序段,转换为原链表的逆序链表,即头指针 head=1,L=[[30,2], [10,3], [20,-1], [15,4],[21,0]]。
 q=-1
 p=head #head 为原链表头指针
 while p!=-1 :
  tmp=L[p][1]
  
 head=q
上述程序段中方框处可选的语句为:
①p=tmp ②q=p ③L[p][1]=q
则方框处语句依次为(  )
A.③②①   B.③①②   C.①③②   D.①②③
答案 A
2.(2022浙北G2联盟期中,14)用两个列表a、b分别保存单向链表中的数据区域和指针区域。如图所示,在节点x与节点y之间插入一个新节点,操作步骤正确的是(  )
①b[i]=b[y]     ②b[i]=b[x]
③b[y]=i    ④b[x]=i
⑤b[i]=x    ⑥b[i]=y
A.③⑥   B.④②   C.①③   D.②④
答案 D 
3.(2023浙江开学考,10)已知一个链表a,其a[i][0]存储索引i下节点的数据区域,a[i][1]存储索引i下节点的指针区域。对于当前链表中的一个节点p(索引为p),若要删除p的后一个节点q(q=a[p][1]),则应执行语句(  )
A.a[p]=a[q]
B.a[p][1]=a[q][1]
C.a[p]=a[a[q][1]]
D.a[p]=a[q];a[p][1]=a[q][1]
答案 B 
4.(2022杭州期中,12)在Python中用列表模拟链表结构,某程序段如下:
a=[['H',1],['a',2],['n',3],['g',4],['2',5],['0',6],['2',7],['2',0]]
p, head=3,3;q,c=-1,0;m,n=3,0
while n<4:
  c=c+1
  if c==m:
    n=n+1;c=0
    if p==head:
head=a[p][1]
a[q][1]=head
p=a[p][1]
    else:
 a[q][1]=a[p][1]
 p=a[p][1]
  else:
q=p
p=a[p][1]
#从头节点开始遍历链表a逻辑顺序的所有节点,并依次输出节点的数据,代码略
该程序段执行后的输出结果为(  )
A.ng02   B.g02n   C.2an2   D.22an
答案 D 
5.(2022诸暨期末,8)某单向链表如图所示,在data2与data3之间插入一个新节点data4(p指向data2,r指向data4。列表data来记录链表数据域,列表next来记录指针域),以下选项中正确的执行步骤为(  )
①next[p]=next[r]    ②next[p]=r
③next[r]=p    ④next[r]=-1
⑤next[r]=next[p]    ⑥next[p]=-1
A.③⑥   B.⑤②   C.①④   D.⑤②④
答案 B 
6.(2022杭嘉湖金月考,15)山顶上有10个圆形排列的洞,一只狐狸和一只兔子各住一个洞。狐狸总想吃掉兔子。一天兔子对狐狸说:“你想吃我有一个条件,先把洞从1~10编上号,你先到1号洞找我;第二次隔1个洞(即3号洞)找我,第三次隔2个洞(即6号洞)找我,依此类推,次数不限。但狐狸从早到晚进进出出了1000次,仍没有找到兔子。请问兔子可能躲在哪个洞里
实现上述功能的Python程序如下,请在划线处填入合适的代码。
hole=[]
n=10
m=1000
#构造一个循环链表,并给n个洞编号,设置洞的初始标志为0
#链表的节点样式为:[洞的标志,洞的编号]
for i in range(n-1):
  hole.append([0,i+1])
     (1)     
#狐狸开始找兔子,将进入过的洞标志改为1,寻找m次结束
head=0
k=head
hole[0][0]=1
for i in range(1,m):
  for j in range(1,i+2):
        (2)     
  hole[k][0]=1
#输出标志仍为0的洞,即兔子可能的藏身地点
for i in range (len(hole)):
  if hole[i][0]==0:
    print("兔子可能躲在第"+ (3) +"号洞")
答案 (1)hole.append([0,0]) (2)k=hole[k][1] 
(3)str(i+1)
考点三 队列
1.(2024届七彩联盟联考,11)有如下程序段:
s=input()
head=0;tail=0;ans=0;tmp=' '
q=[' ']*100
flag=True
for i in range(len(s)):
 if s[i]==',':
  while head!=tail:
   tmp+=q[head]
head+=1
if flag and head head+=1
flag=not flag
  ans+=int(tmp)
  tmp=' ';flag=True
 elif '0'<=s[i]<='9':
  q[tail]=s[i]
  tail+=1
输入s为"1-500,2023900-,",执行该程序段,变量ans的值为(  )
A.100   B.22300   C.22351   D.22400
答案 D 
2.(2022杭州“六县九校”期中,5)有A、B、C、D、E五个人依次进入电梯,结果警告超重了,需要出去一个人才能正常运行,按照数据结构中栈和队列的思维,应离开电梯的人分别是(  )
A.栈:A 队列:E    B.栈:A 队列:A
C.栈:E 队列:A    D.栈:E 队列:E
答案 C 
3.(2024届强基联盟联考,9)执行下列Python程序段,输出结果为(  )
data=[1,2,3,1,2,3]
que=[0]*10
head=tail=0
for i in range(len(data)):
if data[i]%2 !=0:
  que[tail]=data[i]
  tail+=1
elif tail-head>1:
  que[tail-1]+=que[head]
  head+=l
print(que[head:tail])
A.[3,2,1]    B.[1,2,3]
C.[1,3,1]    D.[3,2,3]
答案 D 
4.(2024届新阵地联盟第二次联考,11)有如下程序段:
m=3;n=7
head=tail=0;ans=0
vis=[0]*10;q=[0]*10
for i in range(n):
x=int(input())
if(vis[x]=0):
 ans+=1
 if(tail-head>=m):
  vis[q[head]]=0
  head+=1
 q[tail]=x
 tail+=1
 vis[x]=1
print(ans)
运行该程序段,依次输入x的值:1,2,1,5,4,4,1。则程序运行完成后ans 的值是(  )
A.3   B.4   C.5   D.6
答案 C 
5. (2024届天域全国名校协作体联考,12)已知列表a的长度为6,a[0]至a[5]的值依次为18,12,24,15,21,0,某程序如下所示:
head, tail=0,5
x=a[head]
head+=1
while (head+1) % len(a) !=tail:
   t=y=a[head]
head=(head+1) % len(a)
if x  x,y=y,x
if x % y !=0:
  a[tail]=x % y
  tail=(tail+1) % len(a)
x=t
print(a[head])
程序运行后,输出的结果是(  )
A.24    B.12   
C.3    D.0
答案 C 
6.(2023“山水联盟”开学考,11)有如下Python程序代码:
s="ABCDEF"; head=0;tail=0
que=[" "]*100
for i in range(len(s)):
if i%2==0:
 que[tail]=s[i]
else:
 que[tail]=s[len(s)-i]
tail=tail+1
for i in range(len(s)):
print(que[head], end=" ")
head=head+1
以上程序运行后,输出列表的情况是(  )
A.ABCDEF    B.FEDCBA
C.ACEFDB    D.AFCDEB
答案 D 
考点四 栈
1.(2022浙南名校联盟期末,10)一个栈的入栈序列为“6、9、5、7、8、3”,其出栈序列不可能是(  )
A.3、8、7、5、9、6
B.7、5、9、8、6、3
C.6、5、7、9、3、8
D.5、9、6、3、7、8
答案 D 
2.(2024届百校起点调研测试,9)栈q初始有三个值,经过一系列入栈、出栈操作后,栈为空,若元素出栈的顺序是1,2,3,4,5,6,7,则栈q初始的情况可能是(  )
A.[1,2,3]    B.[7,5,6]
C.[6,3,1]    D.[4,7,2]
答案 C 
3.(2024届Z20联盟联考,9)若元素入栈的顺序是1,2,3,4,5,6,不允许连续三次入栈,则可能的出栈序列为(  )
A.2,3,5,1,6,4    B.1,2,3,6,5,4
C.2,4,3,1,6,5    D.2,5,4,6,3,1
答案 C 
4.(2024届七彩联盟联考,9)假设栈S的最大长度为3,其初始状态和终止状态均为空,经过一系列入栈和出栈的操作,若元素最后的出栈序列为F,E,D,C,B,A,则可能的入栈顺序为(  )
A.ABCDEF    B.ACDFEB
C.BEFACD    D.BFDECA
答案 D 
5.(2024届嘉兴基测,12)待入栈的序列a有多种出栈序列,以下函数用于判断序列b是不是a的出栈序列,代码如下:
def judge(a,b):
n=len(a);st=[-1]*n
top=-1;i=j=0
while i top+=1
   ①  
 i+=1
 while top>-1 and   ②  :
  top-=1
  j+=1
return top==-1
from random import shuffle
a=[1,2,3,4,5]
b=[1,2,3,4,5]
shuffle(b)  #将序列b的元素随机排序
if judge(a,b):
  print(b,'是', a,'的出栈序列')
else:
  print(b,'不是',a,'的出栈序列')
程序运行结果如图所示。划线处应填写的语句是(  )
python 12.py
[2,5,4,3,1]是[1,2,3,4,5]的出栈序列
python 12.py
[5,2,3,1,4]不是[1,2,3,4,5]的出栈序列
A.①st[top]=a[i] ②st[top]==b[j]
B.①st[top]=a[i] ②st[-1]==b[j]
C.①st[top]=b[i] ②st[top]==a[j]
D.①st[top]=b[i] ②st[-1]==a[j]
答案 A 
6.(2022 Z20名校联盟,10)某算法利用“栈”思想进行字符串处理,其步骤如下:①创建长度为n的空栈,字符依次入栈;②当达到栈满状态或数据全部入栈时,字符依次出栈,按照出栈顺序连接成新字符串:③若还有未处理的字符,则重复步骤①②,直到全部字符处理完毕。实现该功能的 Python程序如下:
s=input("请输入字符串:")
n=5;st=[" "]*n
top=-1;i=0;m=" "
while i while  (1)  and i   (2) 
  st[top]=s[i]
  i+=1
 while top!=-1:
  m+=st[top]
   (3) 
print("密文:" ,m)
加框处(1)(2)(3)的代码由以下代码组成:
①top-=1 ②top+=1 ③top+1④top下列选项中代码顺序正确的是(  )
A.④②①    B.③①②
C.③②①    D.④①②
答案 C 
7.(2022诸暨海亮高中月考,10)有如下程序段:
bt=["A","B","C","D",None,"E","F"]
result=[]
stack=[]
i=0
while stack or (i  if i < len(bt) and bt[i] is not None:
    stack.append(i)
    i=2*i+1
  else:
    i=stack.pop()
    result.append(bt[i])
    i=2*i+2
print("-".join(result))
则程序运行后输出的结果为(  )
A.A-B-D-C-E-F    
B.D-B-E-F-C-A
C.D-B-A-E-C-F    
D.A-B-C-D-E-F
答案 C 
考点五 树
1.(2024届Z20联盟联考,8)某二叉树的树形结构如图所示,其后序遍历结果为“物技化数英语”,则中序遍历结果为(  )
A.语数英物化技    B.物数技化语英
C.语数物化技英    D.化物技英数语
答案 B 
2.(2022名校协作体,10)已知二叉树T2的后序遍历序列为G-D-H-E-B-I-F-C-A,中序遍历序列为D-G-B-E-H-A-C-I-F,则二叉树T2的前序遍历序列为(  )
A.A-B-D-G-E-H-C-I-F
B.A-B-D-G-E-H-C-F-I
C.A-B-D-G-E-H-F-C-I
D.该二叉树形态不唯一,无法确定
答案 B 
3.(2024届新阵地联盟第二次联考,8)某二叉树的树形结构如图所示,其后序遍历结果为FABGDEC,则中序遍历结果为(  )
A.FDAGBCE    B.FDABGEC
C.AGBDFCE    D.FDAGBEC
答案 A 
4.(2024届天域全国名校协作体联考,8)下列二叉树中,后序遍历结果不为CBFEAD的是(  )
  
  
答案 D 
5.(2024届七彩联盟联考,8)某二叉树用一维数组表示(见表)。该二叉树从根节点开始,按照从上到下,从左到右的顺序依次用A-H字母表示,该二叉树的中序遍历为(  )
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
A B C D E F G H
A.DBGEACFH    B.DBGEACHF
C.DBEGACHF    D.ABCDEFGH
答案 A 
考点六 大数据时代的数据的组织
1.下列关于实时查询数据系统中的数据结构的说法,不正确的是(  )
A.在实时查询系统中使用数组,时效性较差
B.在链表中查找数据时效性较高,插入数据时效性较低
C.跳跃表基于有序链表
D.跳跃表通过跨区间、跳跃性的比较,避免了依次比较,提高了效率
答案 B 
2.有如下跳跃表:
若要在原链表中插入元素7,则数据元素需要比较的次数为(  )
A.1   B.3   C.4   D.5
答案 B 
3.下列关于Hadoop的说法,不正确的是(  )
A.Hadoop是一种超大规模,高可靠性,高可扩展性的数据库
B.Hadoop是Google云计算技术的开源实现
C.使用Hadoop可以在POI数据的处理中获得更方便的体验和更低廉的成本
D.Hadoop可以对海量地理信息进行处理和计算
答案 A 
专题综合练
题组一
1.(2024届名校协作体联考,8)某二叉树的前序遍历结果为GFDECAB,中序遍历结果为DFGCAEB。关于该二叉树,以下说法正确的是(  )
A.该二叉树的后序遍历为ADFCBEG
B.该二叉树的深度为4,节点C在第3层
C.该二叉树的叶子节点数比非叶子节点数多一个
D.该二叉树可以通过添加3个节点后变为完全二叉树
答案 B 
2.(2024届强基联盟联考,8)某二叉树的树形结构如图所示,其后序遍历结果为FBCEAD,则前序遍历结果为(  )
A.ABCDEF    B.FEDCBA
C.DFACBE    D.FDBCAE
答案 C 
3.(2024届强基联盟统测,8)已知某二叉树的后序遍历为GDBEHFCA,中序遍历为DGBAECHF,下列说法正确的是(  )
A.该二叉树中叶子节点有3个
B.该二叉树的前序遍历为ABDGCEHF
C.该二叉树是一棵完全二叉树,树的高度为4
D.该二叉树中度为1的节点有2个
答案 A 
4.(2024届新阵地联盟第二次联考,9)栈S初始状态为空栈,将序列3,2,5,7,1中元素逐一入栈,当栈空或入栈元素比栈顶元素大时则入栈,否则出栈至符合条件再入栈。序列所有元素入栈完毕后,栈内剩余元素出栈,直至栈空。则出栈的顺序是(  )
A.17523    B.37521
C.37512    D.32751
答案 B 
5.(2024届天域全国名校协作体联考,9)利用栈求逆波兰表达式(表达式由操作数和运算符组成)的方法是:从左往右扫描该表达式,遇到操作数时入栈;遇到运算符时,把处于栈上方的两个元素依次出栈,用运算符计算,并把计算结果压入栈中。如此反复操作,直至表达式扫描结束。当用该算法求逆波兰表达式abcd-*e/+f-的值时(abcdef表示不同的操作数),所使用的栈的深度至少为(  )
A.3   B.4   C.5   D.6
答案 B 
6.(2024届嘉兴基测,11)长度为5的循环队列que,que[0]至que[4]的值依次为'a','b','c','d','e',执行如下程序段后,输出的最后一个字符为 (  )
n=5;head=0;tail=4
que=['a','b','c','d','e']
while head!=tail:
  if head%4==0:
   print(que[head])
  else:
   tail=(tai1+1)%n
   que[tail]=que[head]
  head=(head+1)%n
print(que[head])
A.b   B.c   C.d   D.e
答案 B 
7.(2024届发展共同体联考,9)某种特殊的队列Q,支持以下三个操作:
操作Q1:若队列非空,队首元素出队,并输出;
操作Q2:若队列非空,队首元素出队;
操作Q3:一个元素入队。
以上任意一种操作后,若队列非空,新的队首元素仍为队列中所有元素的最小值。
若队列Q初始状态为空,依次进行Q3、Q2、Q1、Q2、Q3、Q1、Q3七次操作后,下列说法正确的是(  )
A.当前队列中的元素个数为2
B.输出的元素个数为2
C.第一个输出的元素肯定比当前队首元素大
D.队列初始状态是不是空对输出结果有影响
答案 D 
8.(2024浙江1月选考,8,2分)栈S从栈底到栈顶的元素依次为1,2,3,队列Q 初始为空。约定:U 操作是指元素出栈后入队,H 操作是指元素出队后再入队。经过UUHU系列操作后,队列中队首到队尾的元素依次为(  )
A.2,1,3   B.3,1,2   C.1,3,2   D.2,3,1
答案 D 
9.(2024浙江1月选考,9,2分)数组元素a[0]至a[n-1]依次存放着n个数据,现需要将元素a[n-1]插入在下标为x(0≤xtemp=a[n-1]
for i in range(n-2,x-1,-1):
        
a[x]=temp
A.a[i+1]=a[i]    B.a[i-1]=a[i]
C.a[i]=a[i+1]    D.a[i]=a[i-1]
答案 A 
10.(2024届发展共同体联考,11)有如下程序段:
s=[' ']*len(a)
head=2;q=head;top=-1
while q!=-1:
  top+=1
  s[top]=a[q][0]
  q=a[q][1]
print(s[top-2])
若a=[['a',3],['b',0],['c',1],['d',-1]],则输出的结果为(  )
A.a   B.b   C.c   D.d
答案 B 
11.(2024届强基联盟联考,11)有如下Python程序段:
s=input()
stack=[0]* len(s);top=-1;presign='+';num=0
for i in range(len(s)):
if '0'<=s[i]<='9':
  num=num*10+int(s[i])
if i==len(s)-1 or s[i] in '+-*/':
  if presign=='+':
    top+=1
    stack[top]=num
  elif presign=='-':
    top+=1
    stack[top]=-num
  elif presign=='*':
    top+=1
    stack[top]=stack[top-1]*num
  else:
    top+=1
    stack[top]=stack[top-1]
//num
  presign=s[i]
  num=0
print(sum(stack))  #sum函数对stack中所有元素求和
若输入'5*4-6+10/3',程序运行后,输出的结果是(  )
A.32   B.24   C.17   D.8
答案 A 
12.(2023浙江1月选考,15,9分)有2组器件共n个,要用一台检测设备检测。每个送检器件的信息包含送达时间、检测时长和优先级。优先级有m(1编写程序模拟检测过程,先合并2组器件的数据,然后计算所有器件的平均等待时长,其中每个器件等待时长为其开始检测时间与送达时间的时间差。(时间单位均为秒)
请回答下列问题:
(1)由题意可知,图中器件A、B、C、D的检测顺序为A—C—D—B,A、C、D的等待时长分别为0、1、0,B的等待时长是    。
送达时间 检测时长 优先级
A 0 3 2
B 1 1 2
C 2 1 1
D 4 3 0
11 3 2
12 2 2
(2)定义如下merge(lst1, lst2)函数,参数 lst1和 lst2的每个元素由送达时间、检测时长和优先级3项构成,lst1和 lst2均已按送达时间升序排列。函数功能是将lst2中的元素合并到lst1中,并将 lst1按送达时间升序排列,函数返回lst1。
def merge(lst1,lst2):
  i=len(lst1)-1
  j=len(lst2)-1
  for t in range(len(lst2)):
   lst1.append([0,0,0])  #为lst1追加一个元素[0,0,0]
  k=len(lst1) -1
while j >=0:
   if i >=0 and lst1[i][0]>lst2[j][0]:
  lst1[k]=lst1[i]
i -=1
   else:
lst1[k]=lst2[j]
j -=1
   k -=1
 return lst1
①调用merge(lst1,lst2)函数,若lst1为[[0,3,2],[1,1,2],[12,2,2]],lst2为[[2,1,1],[4,3,0], [11,3,2]],则while语句中循环体的执行次数是    。
②若函数中 while语句的条件“j>=0”误写为“k>=0”,会导致某些情况下无法得到符合函数功能的结果。调用merge(lst1, lst2)函数,下列4组数据中能测试出这一问题的是    (单选,填字母)。
A.lst1=[[0,3,2],[4,3,0]]
lst2=[[1,1,2]]
B.lst1=[[1,1,2]]
lst2=[[0,3,2],[4,3,0]]
C.lst1=[[1,1,2],[4,3,0]]
lst2=[[0,3,2]]
D.lst1=[[4,3,0]]
lst2=[[0,3,2],[1,1,2]]
(3)实现模拟检测过程并计算平均等待时长的部分Python程序如下,请在划线处填入合适的代码。
def proc(data,m):
  n=len(data)
  queinfo=[]
  for i in range(m):
   queinfo.append([-1, -1])
# queinfo追加一个元素[-1,-1]
  for i in range(n):
data[i].append(-1)  # data[i]追加一个元素-1
  curtime=0
waitnum=0
i=0
  ①  
while i < n or waitnum > 0:
  if i < n and data[i][0] <=
curtime:
   k=data[i][2]
   if queinfo[k][0]==-1:
     queinfo[k][0]=i
   else:
       ②  
     data[p][3]=i
   queinfo[k][1]=i
   waitnum+=1
   i+=1
  elif waitnum >0:
k=0
while queinfo[k][0]==-1:
  k+=1
p=queinfo[k][0]
total+=curtime-data[p][0]
curtime+=data[p][1]
  ③  
waitnum -=1
  else:
    curtime=data[i][0]
return total / n
'''
读取2组器件的数据,分别存入列表data1和 data2中。2个列表的每个元素包含3个数据项,分别对应器件的送达时间、检测时长和优先级。data1和 data2中的数据已分别按送达时间升序排列,代码略
读取优先级等级个数存入m,代码略
'''
data=merge(data1, data2)
print(proc(data, m))
答案 (1)6或6秒 (2)①4 ②A (3)① total=0或其他等价表达式 ②p=queinfo[k][1]或其他等价语句 
③queinfo[k][0]=data[p][3]或其他等价语句
13.(2023浙江6月选考,15,9分)某工程包含n个任务(编号为0~n-1),每天可以有多个任务同时进行。某些任务之间有依赖关系,如图a所示,任务4依赖于任务1,任务1依赖于任务2。即任务2完成后才可以开始任务1,任务1完成后才可以开始任务4。不存在一个任务依赖于多个任务,或多个任务依赖于同一个任务的情况。
现已对该工程的依赖关系进行了梳理,结果如图b所示,标记“T”表示依赖关系需保留,标记“F”表示依赖关系需删除。
根据每个任务完成所需的天数和梳理后的依赖关系,编写程序,首先删除标记为“F”的依赖关系,然后计算工程最快完成所需的天数,并以工程最快完成所需的天数为期限,计算每个任务最晚必须开始的时间。
任务A 任务B 标记
0 5 T
5 4 F
4 1 T
1 2 T
2 3 F
注:任务A依赖于任务B
图b
请回答下列问题:
(1)若某工程有6个任务,任务间依赖关系如图a所示,完成任务0~5所需天数分别为2,1,3,5,1,6,则工程最快完成需要  天。
(2)定义如下erase(lst)函数,参数 lst列表的每个元素表示一个依赖关系。函数的功能是删除标记为“F”的依赖关系,返回保留的依赖关系的个数。
def erase(lst):
  i=0
  j=len(lst)-1
  while i<=j:
    if lst[i][2]=='T':
      i+=1
    else:
      if lst[j][2]=='T':
lst[i]=lst[j]
i+=1
      j-=1
  return i
若lst列表依次存储图b所示的依赖关系,如 lst[0]为[0,5,'T'],调用erase(lst)函数,则语句“lst[i]=lst[j]”的执行次数为  。
(3)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
def proc(n,lst,task):
pr=[0]*n
w=[0]* n  # w[i]存放任务最晚必须开始的时间
m=erase(lst)
for i in   ①  :
task[lst[i][1]][1]=lst[i][0]
pr[lst[i][0]]=1
c=[]
days=0  # days存放工程最快完成所需的天数
for i in range(n):
if pr[i]==0:
  k=i
  s=0
  while k!=-1:
    c.append(k)
    s+=task[k][0]
      ②  
  if s > days:
    days=s
for i in range(n-1,-1,-1):
k=c[i]
if task[k][1]==-1:
  w[k]=days-task[k][0]+1
else:
    ③  
#输出days,以及保存在w中的每个任务最晚必须开始的时间,代码略
"'
工程包含的任务数存入变量n
任务间的依赖关系存入lst列表
lst[0]包含3项,任务lst[i][0]依赖于任务lst[i][1],lst[i][2]存放保留/删除标记,任务数据存入task列表
task[i]包含2项,task[i][0]为完成任务所需天数,task[i][1]的初值为-1
代码略
"'
proc(n,lst,task)
答案 (1)8 (2)1 (3)① range(m)或 range(0, m)或 range(0, m ,1) 或 range (m -1,-1,-1)或 range(erase (lst))或 range(0, erase (lst))或 range(0, erase (lst),1)或 range(erase (lst)-1,-1,-1) ② k=task [k][1] 
③ w [k]=w [task [k][1]]- task [k][0]或 w [k]=w [c [i+1]]- task [k][0]或其他等价答案(这里面可以把 k 换成 c[i])
14.(2024届Z20联盟联考,15)小明同学去看病,当他在一位医生的诊室门口等待就诊的时候,发现了叫号系统的页面上有两行病人名单。第一行名单为正常排队等待就诊的序号,第二行名单为过号或检后再诊而等待的序号。叫号的规则是先在第一行叫2个就诊序号,再到第二行叫1个就诊序号。小明同学回家后将刚才发现的叫号规则编写了Python程序。效果如图所示:
图①:当前到来的就诊序号是3号,为过号或检后再诊序号,进入第二行,先到达先就诊。
图②:当前到来的就诊序号是4号,为过号或检后再诊序号,进入第二行。
图③:当前到来的就诊序号是16号,为正常排队等待就诊的序号,进入第一行,按就诊序号顺序排列。
图④:开始叫号,按照正常排队等待就诊叫号2位,过号或检后再诊叫号1位,得到新的顺序。
(1)请在划线处填入合适的代码。
(2)加框处的代码有误,请改正。
def output(head, a, b):
p=head
head_b=0; tail_b=len(b)
while p!=-1:
  print(a[p][0], end="->")
  p=a[p][1]
print()
while head_b!=tail_b:
  print(b[head_b], end="->")
  head_b+=1
print()
def insert(data,a,b):  #根据挂号的序号分别进入第一行名单或第二行名单
  head_a=a[0][0]
  if data>  ①  :
   p=0
   a.append([data,-1])
   while p!=-1:
     if data<=a[p][0]:
       a[-1][1]=p
       a[q][1]=len(a)-1
       break
     else:
       q=p
       p=  ②  
   if p==-1:
     a[q][1]=  ③  
   output(0,a,b)
  else:
   b.append(data)
   output(0,a,b)
#a、b赋初值,代码略
#如图①所示:a=[[13,1],[15,2],[17,-1]];b=[3]
while True:
  data=int(input("请输入取号:"))
#输入0表示停止取号,开始叫号
  if data==0:
   break
  insert(data,a,b)
print("====开始叫号====")
p=head=0
head_b=0;tail_b=len(b)
while p!=-1 or head_b!=tail_b:
  if p!=-1 and head_b!=tail_b:
    i=0
    while a[p][1]!=-1:
     print(a[p][0], end="->")
     p=a[p][1]
     i+=1
    print(  ④  , end="->")
    head_b+=1
  elif p!=-1 and head_b==tail_b:
    print(a[p][0], end="->")
    p=a[p][1]
  else:
    print(b[head_b], end="->")
    head_b+=1
答案 (1)①a[0][0]或head_a ②a[p][1] ③len(a)-1
④b[head_b] (2)i<2 and p!=-1或i<=1 and p!=-1
15.(2022山水联盟开学考,15)小赵同学在某游戏平台中获得虚拟的食物、装备、材料等物品,它们分别有不同的价值,现游戏平台有兑换机制,即可用多个不同物品换取一个等值的物品(每个物品只能取一样),下表为小赵同学已获得的物品。
序号 物品名称 数量 单价
0 灵丹 2 1
1 大力丸 1 2
2 止血草 3 5
3 忘魂花 1 7
4 雄黄 1 9
5 灵山仙芝 5 10
6 梅花镖 1 15
7 止血草 1 20
目标置换物品的价值:35。
已获得物品价值依次是:1,2,5,7,9,10,15,20。
依次拿取物品序号的方案有:
取序号为[0,1,2,3,7]的物品;
取序号为[0,1,3,5,6]的物品;
取序号为[0,2,4,7]的物品;
取序号为[0,4,5,6]的物品;
取序号为[2,5,7]的物品;
取序号为[6,7]的物品。
如要换取游戏中的物品“破天锤”,需要35个金币,有多种置换的方式,为方便计算以节省时间,小赵同学编写了如下程序,运行界面和代码如下,请在划线处填入合适的代码。
def exchange(t,pricelist):
  n=len(pricelist)
  stack=[]
  i=0
  num=0
  while   ①   :
    while t>0 and i      if t>=int(pricelist[i]):
stack.append(i)
  ②  
      i+=1
      if t==0:
       print("取序号为",stack,"的物品")
num+=1
    if    ③   :
      i=stack.pop()
      t+=int(pricelist[i])
      ④   
  if num==0:
    print("无方案")
m=int(input("目标置换物品的价值:"))
price=input("已获得物品价值依次是:")
p=price.split(",") #将输入的内容以“,”作分隔,并转换为列表
print("依次拿取物品序号的方案有:")
exchange(m, p)
答案 ①stack or i16.(2022名校协作体联考,15)某校军训,需要按照身高由低到高排成n行5列的方阵。某班学生按照身高(100≤身高<199)由低到高编写编号并将相关信息存在图1所示的“stu.txt”文件中。根据教官提出的排方阵要求,排成如图2所示的方阵,方阵各点显示学生编号。
 
现有延迟报到学生归队,归队学生编号延续该班现有编号依次往后,编写程序完成下列任务:输入学生身高,输出新的方阵布局图。例如:输入学生身高为168,新的方阵布局图如图3所示,学生在方阵的位置:3,4。
(1)若插入学生身高为160 cm,根据图1及范例,该学生应该在图2方阵中的   行    列。
(2)为实现上述功能,请填写划线处代码。
f=open("stu.txt","r")
a=[]
line=f.readline().split()
i=1
while line!=[]:
  a.append([line[0],line[1], i])
  i+=1
  line=f.readline().split()
n=len(a)-1
a[n][2]=-1
sg=input("请输入插入的学生身高(cm):")
xh=str(len(a))
head=1
p=head;q=head
while   ①  :
  p=q
  q=a[q][2]
if q==head:
    ②  
  head=len(a) -1
else:
  a.append([xh,sg,a[p][2]])
  a[p][2]=len(a)-1
p=head
m=1
while p!=-1:
  if m!=5:
    print(a[p][0],end=" ")
    m+=1
  else:
    print(a[p][0])
    m=1
      ③  
答案 (1)1,5 (2)①a[q][1]17.(2022 A9协作体返校考,15)学校举办了“语文作文现场赛”,参赛同学成绩存储在文本文件“gra.txt”中,如图a所示(每一行记录一位同学的姓名和成绩,以“:”分隔)。陈老师利用Python程序对作文成绩进行处理,统计出各个分数等级的人数,并输出结果。程序运行界面如图b所示。
实现上述功能的Python程序如下,请在划线处填入合适的代码。
def cla(x): #判断成绩等级
  if x>=50:
   return "A"
  elif x>=40:
   return "B"
  elif x>=30:
   return "C"
  else:
   return "D"
gra=[] #存储各个整数型成绩
num=[0]*4
f=open("gra.txt")
lines=f.readlines() #将f对象的数据按行存入列表lines中
f.close() #关闭文件
for line in lines: #循环读取列表lines 中的每个元素,并做相应处理
  a=line.strip().split(":") #去除结尾的换行符并以冒号为分隔符进行分隔
  gra.append(  ①  )
for i in range(len(gra)): #统计各等级人数
  t=  ②  
  num[ord(t)-65]+=1
print("成绩分布如下: ")
for i in range(len(num)): #输出统计结果
  print(chr(i+65)+"等级有"+ ③ +"人")
答案 ①int(a[1])或int(a[-1]) ②cla(gra[i])
③str(num[i])
18.(2023七彩阳光开学考,15)食堂推出的三款特色菜,分别用A、B、C表示,想用投票方式统计出三款菜的受欢迎程度。每位投票者需要将三款菜按喜爱程度从高到低进行排列,并投出一票。如图a所示,小明负责将文件“投票.txt”中的选票进行统计。第1张选票信息为“A,C,B”,表示投票者认为A菜优于C菜,C菜优于B菜,即A菜也优于B菜。他得到如图b所示的投票情况。对选票进行统计,得到三款菜的偏好,如图c所示,数据第一行中的“6”说明有6张选票显示A菜优于B菜,“10”说明有10张选票显示A菜优于C菜,以此类推……将所有投票进行统计,再将三款菜的得票数进行求和,按得票数从高到低排列,分别为A菜16票,B菜11票,C菜12票,即可得到每款菜的受欢迎程度。
    
    
请回答下列问题:
(1)若有四款菜,投票情况如图d所示,则第2受欢迎的菜为    (填字母)菜。
(2)加框处代码有错误,请改正。
(3)实现上述功能的 Python程序如下,请在划线①②③处填入合适的代码

展开更多......

收起↑

资源预览