内容正文:
第07讲 数组与链表
目录
01 课标达标练
题型01 数组与链表对点选择
题型02 结合真实情境 代码挖空填空
02 核心突破练
03 真题溯源练
01 数组与链表对点选择
1.(数组分段遍历,诸暨 2025-12 诊断第 11 题) 利用冒泡排序算法对数组 arr 进行降序排序,并实现了优化措施:如果在某一轮遍历中没有发生元素交换,则提前结束排序。实现该功能的部分程序如下:
arr = [64, 34, 25, 12, 22, 11, 90]
n = len(arr)
for i in range(n-1):
①
for j in range(0,n-i-1):
if ②:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
③:
if not swapped:
break
print("排序后的数组:",arr)
则①②③处填入的正确代码应为()
A.①swapped = False ②arr[j]>arr[j+1] ③swapped = True
B.①swapped = False ②arr[j]<arr[j +1] ③swapped = True
C.①swapped = True ②arr[j]>arr[j +1] ③swapped = False
D.①swapped = True ②arr[j]<arr[j +1] ③swapped = False
答案:B
解析:降序冒泡。每轮外层循环开始,swapped=False标记本轮无交换;当arr[j]<arr[j+1]说明顺序不对,交换;发生交换则置swapped=True;一轮结束若swapped=False代表本轮没有交换,数组已经有序,break 提前退出。
2.(next/last 数组模拟链表,诸暨 2025-12 诊断第 12 题) 有如下 python 程序:
n =len(info)
last=[-1]*n
next=[n]*n
for i in range(n):
k = info[i]
if last[k]!=-1:
next[last[k]] = i
last[k] =i
若 info 为[1,2,3,2,3,1],执行程序后,next 的值为()
A.[5, 3, 4, 6,6,6] B.[5, 3, 4,-1,-1,-1] C.[0, 5, 1, 3,2, 4] D.[0, 5, 1, 6,6, 6]
答案:A
解析:last[]记录该数值上一次出现的下标;next[]保存相同值下一个出现位置。 i=0,k=1:last [1]=-1 → last [1]=0 i=1,k=2:last [2]=-1 → last [2]=1 i=2,k=3:last [3]=-1 → last [3]=2 i=3,k=2:last [2]=1,next [1]=3;last [2]=3 i=4,k=3:last [3]=2,next [2]=4;last [3]=4 i=5,k=1:last [1]=0,next [0]=5;last [1]=5 循环结束,未更新 next 下标初始为 n=6。得到next=[5,3,4,6,6,6]。
3.(数组保持有序插入,2025-01 浙江选考第 10 题) 数组元素 a [0]-a [n-1] 已按升序排列,现要将 a [pos] 的值加 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
解析:t 是更新后的值,需要向后移动元素,条件:i 没有越界i<n-1,并且 t 仍然大于后面元素t>a[i+1],就继续后移;循环结束把 t 放到 i 位置维持升序。
4.(数组循环移动模拟,2026-01 浙江首考第 12 题) 有如下 Python 程序段:
#获取a的初始值,代码略
i=1
for j in range(1,len(a)):
if a[j]<a[0]:
a[j],a[i]=a[i],a[j]
i+=1
a[0],a[i-1]=a[i-1],a[0]
执行该程序段后,a的值为[2,4,3,5,6,9,7],则下列选项中不可能为a[0]的初始值的是()
A.2 B.5 C.6 D.7
答案:A
解析:算法功能:把小于原 a [0] 的全部元素交换到数组前部;最后将原 a [0] 交换到 i-1 位置成为分割点。最终 a [0] 是原来数组里小于原始 a [0] 的某一个元素。若原始a[0]=2,没有元素小于 2,i 保持为 1,最后交换a[0],a[0],输出数组第一个元素只能等于 2,但数组后面会全部不变,无法得到[2,4,3,5,6,9,7]这个数组结构。
02 结合真实情境 代码挖空填空
1.(一维数组统计,诸暨 2025-12 诊断第 13 (2) 节选)
count=[0]*11
total=[0]*(n+1)
maxscore=0
maxclass=[]
num=len(scores)
for i in range (num):
cls=i//5+1
① ____________ #统计每个得分出现次数
② ____________ #统计班级总分
if scores[i]>maxscore:
maxscore=scores[i]
maxclass=[cls]
elif scores[i]==maxscore and cls not in maxclass:
maxclass.append(cls)
写出划线①、②的代码。
答案: ① count[scores[i]] +=1 ② total[cls] += scores[i] 解析:count 下标对应分数,统计分数频次;total [cls] 对应班级 cls,累加该班选手得分。
2.(链表节点增删,温州 2026 届 4 月二模 15 )
某车间有多类设备,设备用于承接并完成订单对应的各类生产任务。为减少设备启停带来的损耗,若某订单的完成时刻与后续订单的开始时刻相同,且所需的设备类型一致,则合并订单,安排该设备不间断运行。车间根据合并后的订单,优先分配完成时刻最早的该类设备。每台设备一次只能处理一个订单。请回答下列问题。
(1)某段时间内的订单数据如图a所示,设备数据如图b所示。则分配给104订单的设备编号为 。
(2)定义函数merge,用于处理订单合并。def merge(orders):
res =[]
for i in range(len(orders)):
tp, st, t = orders[i][1], orders[i][2], orders[i][3]
k=-1
for j in range(len(res)-1, -1, -1):
if res[j][0]==tp:
k=j
break
if k!=-1 and res[k][1]+res[k][2]==st:
res[k][2] += t
else:
res.append([tp, st, t])
return res
若 orders 初始为[["101","A",1,1],["102","C",1,3],["103","B",2,4],["104","C",4,3],["105","B”、7,2],["106","C",7,2]],执行 merge(orders)后,
①返回值中订单总数为
②变量k的最终值为
(3)根据订单分配设备,若分配成功,则更新该设备的完成时刻,并将设备信息重新插入到序列的合适位置,若分配失败,则另作处理。程序如下,请在划线处填入合适的代码。
def proc(a,head):
p ,best= -l, head
while best != -l:
if ① :
best = -l
break
if lst{best][1]== a[0] and lst{best][2] <= a[1]:
print("启动的设备编号为:",Ist[best][0])
break
p= best
best = lst[best][3]
if best==-l:
#分配失败,该订单另作处理,代码略
else:
②
if best==head:
head = lst[head][3]
else:
③
p,cur==-1,head
while cur!=-1 and lst[cur][2]<=lst[best][2]:
p= cur
cur = lst[cur][3]
if p ==-1:
lst[best][3]= head
head = best
else:
lstlbest][3]= cur
lst[p][3]= best
return head
‘’’
读取订单信息,存储于orders列表,每个元素包含四个数据项,依次为订单编号、所需设备类型、开始时刻和运行时长。
读取设备信息,存储于1st列表,每个元素包含三个数据项,依次为设备编号、设备类型完成时刻(初始值为0)。设备数量存储于变量 m,代码略。
‘’’
fori in range(m):
lst[i].append(i + 1)
lst[m -1][3]= -1
orders = merge(orders)
head =0
for i in range(len(orders)):
p = proc(orders[i],head)
#输出订单分配后的设备信息,代码略
答案(1)0 (2)①4 ②1
(3)①lst[best][2]> a[1] 或 a[1]<lst[best][2] False 或 其他等价答案均给分
②lst[best][2]=a[1]+a[2]或 lst[best][2]= a[2]+a[1] 其他等价答案
③lst[p][3]=lst[best][3] 其他等价答案
解析
(1) 答案:0
规则:优先选同类型、完成时刻最早的 A 类设备。
A 类设备:0 (完成 0)、1 (完成 2)、2 (完成 4);订单 104 是 A 类,开始时刻 8。设备 0 完成时刻最早,分配给设备 0。
(2) merge 函数:合并订单,同类型、前订单完成 = 后订单开始,就合并时长
orders 初始:`[["101","A",1,1],["102","C",1,3],["103","B",2,4],["104","C",4,3],["105","B",7,2],["106","C",7,2]]`
102 (C,1,3),完成时刻 1+3=4;104 (C,4,3):开始 = 前面完成,合并,时长 3+3=6
其余订单无法合并
合并后列表:`[["101","A",1,1],["102","C",1,6],["103","B",2,4],["105","B",7,2],["106","C",7,2]]`
① 总数:4
② 循环处理最后一条订单`["106","C",7,2]`,向前查找 C 类型,找到索引 1,`k=1`,最终 k=**1**
(3) 单链表分配设备代码
思路:遍历链表找符合条件设备;分配成功更新完成时间,再把该节点从原链表摘下,重新插入链表保持升序。
① `lst[best][2] > a[1]`
含义:当前设备完成时刻 > 订单开始时间,后面设备完成时刻只会更大,不用继续遍历,直接退出循环,分配失败。
② `lst[best][2] = a[1] + a[2]`
分配成功:更新设备的完成时刻 = 订单开始时刻 + 订单运行时长。
③ `lst[p][3] = lst[best][3]`
摘下 best 节点:p 是 best 前驱节点,把 p 的后继指向 best 原来的后继。
1.(数组区间处理,温州 2026 届 4 月二模第 10 题) 有如下 Python 程序段:
st=i=0
while i<len(d) - 1:
if d[i]>=d[i+1]:
if i-st+1>2:
st=i+1
i+=1
若 d=[1,3,5,5,2,4,4,6] , 执行该程序段后,st 的值为()
A.3 B.5 C.6 D.7
答案:C
解析: st 初始 = 0,i 遍历 0~6。 i=0 d [0]<d [1];i=1 d [1]<d [2];i=2 d [2]==d [3],i-st+1=3>2 → st=i+1=3; i=3,d [3]>d [4];i-st+1=1,不修改 st; i=4,d [4]<d [5];i=5 d [5]==d [6];i-st+1=3>2 → st=i+1=6; i=6 d [6]<d [7];循环结束 st=5。
2.(链表索引数组,2026-01 浙江首考 15 题选择题化截取原题逻辑)
背景:lst 模拟链表,节点[start,end,next],头节点 lst [0];p 代表当前遍历节点下标;num = lst [p][1]-lst [p][0]+1 代表该链表节点对应连续编号区间长度。
bestnum=len(items)+1
bestpre,pre=-1,0
p=lst[0][2]
while p!=-1 and need!=bestnum:
num=lst[p][1]-lst[p][0]+1
if num>=need and num < bestnum:
bestnum=num
bestpre = pre
pre=p
p=lst[p][2]
已知need=3,链表节点区间分别:[201,203]长度 3、[208,212]长度 5,执行循环结束后 bestnum 值为()
A.3 B.4 C.5 D.6
答案:A
解析:条件num>=need and num<bestnum;初始 bestnum=len (items)+1 为很大数。第一个节点 num=3≥3,更新 bestnum=3,bestpre 记录前驱;第二个 num=5≥3,但 5 不小于 bestnum (3),不更新。最终 bestnum=3。
3.(数组逻辑统计,2025-01 浙江选考 13 题数组调度逻辑)
n=6
a=[0]*n
t=0
cnt=0
for i in range(n):
if a[i]>90:
cnt+=1
if a[i]>a[t]:
t=i
若某次采集负载率a=[75,85,88,0,88,87],运行循环结束后 t 的值为()
A.1 B.2 C.4 D.5
答案:B
解析:t 保存数组最大值下标;逐个比较: i=0 a [0]=75;t=0 i=1 a [1]=85>75 →t=1 i=2 a [2]=88>85 →t=2 i=3 a [3]=0;不变 i=4 a [4]=88,不大于 a [t]=88,不变 i=5 a [5]=87,不大于 88。最终 t=2。
填空题
4.(链表拆分修改,温州 2026 届 4 月二模 15⑶原题填空)
背景:lst 存储链表,best 为选中节点下标;bestpre 是 best 前驱;need 代表要截取的元素个数;节点格式[设备编号,设备类型,完成时刻,后继指针]。 需求:best 节点原区间长度大于 need,截取 need 个元素留在 best 节点,剩余部分新建节点插入链表。
if bestnum>need:
____________ #修改best节点完成时刻;剩余部分生成新节点
答案:lst[best][2] = a[1] + a[2]
解析:原题参考答案,best 节点更新完成时刻,截取 need 时长;后续新建节点插入链表。
1.某算法的部分流程图如第7题图所示,若n的值为8,数组元素 a[0]至 a[n-1]依次存放 2,3,4,8,5,4,9,6,执行这部分流程后,输出c的值为
A.1
B.2
C.3
D.4
答案:C
解析:初始 n=8,数组 a=[2,3,4,8,5,4,9,6],i=7
i=7:a [7]=6 < a [6]=9,交换,数组 [2,3,4,8,5,4,6,9],c=7,i=6
i=6:a [6]=6 不小于 a [5]=4,不交换,i=5
i=5:a [5]=4 < a [4]=5,交换,数组 [2,3,4,8,4,5,6,9],c=5,i=4
i=4:a [4]=4 < a [3]=8,交换,数组 [2,3,4,4,8,5,6,9],c=3,i=3
i=3:a [3]=4 不小于 a [2]=4,不交换,i=2
i=2:a [2]=4 不小于 a [1]=3,不交换,i=1
i=1:a [1]=3 不小于 a [0]=2,不交换,i=0,循环结束,c=3,答案 C
2.(2024-06 浙江选考第 12 题|链表操作) 每个节点包含数据区域和指针区域,h 为头指针。现要按链表顺序将这 n 个节点中的数据依次存放到d[0][0]、d[1][0]…d[n-1][0]中,最终保持节点链接关系不变。实现上述功能的 Python 程序段如下,方框中应填入的正确代码为()
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
A.d[i][1] = d[p][1];d[p][1] = i B.d[p][1] = d[i][1];d[i][1] = p
C.d[i][1] = p;d[p][1] = d[i][1] D.d[p][1] = i;d[i][1] = d[p][1]
答案:B
解析:交换 i、p 位置节点的数据后,需要修正两个节点的后继指针;d[p][1]=d[i][1]把 p 节点继承 i 原来的后继;d[i][1]=p,让 i 节点指向 p,维持链表链接关系不变。
3.(2024-06 浙江选考第 12 题|链表操作原题) 每个节点包含数据区域和指针区域,h 为头指针。现要按链表顺序将这 n 个节点中的数据依次存放到d[0][0]、d[1][0]…d[n-1][0]中,最终保持节点链接关系不变。实现上述功能的 Python 程序段如下,方框中应填入的正确代码为()
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
A.d[i][1] = d[p][1];d[p][1] = i B.d[p][1] = d[i][1];d[i][1] = p
C.d[i][1] = p;d[p][1] = d[i][1] D.d[p][1] = i;d[i][1] = d[p][1]
答案:B
解析:交换 i、p 位置节点的数据后,需要修正两个节点的后继指针;d[p][1]=d[i][1]把 p 节点继承 i 原来的后继;d[i][1]=p,让 i 节点指向 p,维持链表链接关系不变。
4.某数据序列data中的元素均为小于127的正整数。现在要对data进行加密,处理过程分"变换"和"重排"两步。
"变换"处理方法是用指定的n组序列R0、R1...Rn-1依次对data进行变换。利用R对data进行变换的程是:在data 中查找所有与R.相同的子序列,将找到的每个子序列中的元素值加上R.的长度值Li,并在各子序列前插入一个标记元素(值为127+L),这些子序列及标记元素不再参与后续的变换。如data [3,5,1,6,3,8,7,5,1,8,7],指定的两组序列为[5,1]、[3,8,7],"变换"处理后的data为[3,129,7,3,6,130,6,11,10,129,7,3,8,7]
对data"重排"处理通过给定的shuff函数实现。请回答下列问题:
(1)若data 为[3,5,1,6,3,8,7,5,1,8,7],指定的两组序列为[5,1]、[8,7],经过"变换"处理后,data 中插入的标记元素个数为
(2)"重排"处理的shuff函数如下:
def shuff(data, c): #根据列表c对列表data进行重排
#若列表data的长度不是列表c长度的整数倍,则用0补足,代码略
m=len(c)
s=[0]*m
k=0
while k<len(data):
for i in range(m):
s[i]=data[k+i]
for i in range(m)
data[k+i]=s[c[i]]
k+=m
若data为[3,129,7,3,130,6,11,10],c为[1,3,0,2],调用shuff(data,c)后,data的最后一个元素值为
(3)实现加密功能的部分Python程序如下,请在划线处填入合适的代码。
def compare(data, i, r):
#函数功能:返回data从索引i位置、r从索引0位置开始的连续相等元素的个数
#例如r为[7,3,6],data从索引i位置开始的元素依次为7,6,7,3...,函数返回1
j=0
while j<len(r) and i+ j< len(data):
if ① :
break
else:
j+=1
return j
def trans(data, r, segs):
newsegs=[]
for s in segs:
if s[0]==0:
h=i=s[1]
m=len(r)
whilei+m<=s[2]+1:
if compare(data, i, r)m
if i>h:
newsegs.append([0, h, i-1]) #为newsegs追加一个元素
newsegs.append([m, i, i+m-1])
i+=m
②
else:
i+=1
if h<=s[2]:
newsegs.append([0, h, s[2]])
else:
newsegs.append(s)
return newsegs
def update(data, segs):
for s in segs:
if s[0]!=0:
data.append(0)
p=len(data)-1
for i in range(len(segs)-1,-1,-1):
for j in range(segs[i][2]. segs[i][1]-1,-1):
③
p-=1
if segs[i][0]> 0:
data[p]=127+segs[i][0]
p-=1
#读取待加密数据存入data,读取指定的若干组用于变换的序列存入rs,代码略。
列表 segs 用于记录 data 的变换信息,segs[包含三个元素,segs[i][0]、segs[i][1]、segs[i][2]分别表示data中一个子序列的状态、起始位置和结束位置,如果segs[i][0]为0,则表示该子序列未经过变换。
segs =[[0,0,len(data)-1]]
for r in rs:
segs=trans(data,r, segs) #根据r更新segs
update(data, segs) #利用segs完成对data的变换操作
c=[1,3,0,2]
shuff(data,c)
#输出加密后的data序列,代码略
【答案】(1)4(1分)(2)11(2分)(3)①r[j]!=data[i+j](2分)②h=i(2分)③data[p]=data[j]+segs[i][0](2分)
【解析】本题考查数纽的索引、遍历、插入、区信息维护等基本操作,阅读量较大,难度适中。
(一)读题读题:结合题意描述的加密方法及样例,模拟出问题(1)中,序列[5,1]、[8,7]在列表data中分别
查找到2次,且都不会被重复标记,故插入的标记元素个数为4。
(二)审题:从主程序入手,特别关注到列表segs的含义,大致推断出算法思想为:
1.枚举r序列,通过trans函数,根据每个列表r维护出列表data的交换信息,存入列表segs(该列表被
不断更新);
(其中 trans 函数还调用了compare 函数,从注释可知该函数实现在data 中查找与当前r相同的子序列的信息)
2.利用列表segs 记录的交换信息,通过 update 函数实现对 data的变换操作:
3.根据列表c对列表data进行重排。
(三)做题:基于算法思路,从trans函数入手,首先考虑其调用的compare函数,即问题(3):根据注释,
该函数的功能为返回data从索引i位置,r从索引(位置开始的连续相等元素的个数。如下图示例,可得返回值j=3,表示连续相等的个数为3。同时可以发现,当返回值j和len(r)相等时,说明data从索引 i位置开始存在r序列。
填空1处的答案为:data[i+j]!=r[j]。
接着考虑trans函数,根据当前变换数组r更新segs中的交换信息,实现思路为:
枚举 segs 中的交换信息,对于未被标记(s[0]-0)的区间(端点分别为s[1]和s[2])信息进行维护。若通过 compare函数找到匹配的r序列,則对当前的交换信息进行更新,实现过程如下图示例:
得到3条交换信息追加到列表newegs,分别为:
[0,3,3] newegs 中对应的追加元素为[0,h,i-1]
[3,4,6] newegs 中对应的追加元素为[m,i,i+m-1]
[0,7.10] 即上图中为i+m 到 s[2]的区间,对应 newegs 中对应的元素为[0,h,s[2]],故在追加到 newegs
前,h的值需要更新,实现代码为:i+=m;h=i填空2处的答案为:h=i。
接着考虑update 函数:首先枚举segs,对于每条需要插入标记(s[0]!=0)的交换信息,预先在data数组后加元素0,用于扩展列表data的长度:然后插入标记元素,并修改各个序列中的元素的值,考虑到列表segs被各个序列r更新的先后顺序,后更新加入的交换信息应被优先用于变换,故需逆序枚举segs中的元素,代码实现时,对于segs[i],因为标记元素实现的是插人操作,所以列表data中segs[i][1]到segs[i][2]区间中的元素应逆序遍历(j循环逆序,p不断前移),令区间中各个值增加segs[i][0]。填空3处的答案为data[p]=data[j+segs[i][0]:然后在p位置插入标记元素
最后考虑shuff函数,实现时考查了索引数组,通过简单模拟可以发现,需分2次修改data 中的前4个和后4个元素。第2次修改时的元素为[130,6,11,10],最后一个元素的索引值为2,该处的元素11即为答案。
学科网(北京)股份有限公司1 / 17
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
第07讲 数组与链表
目录
01 课标达标练
题型01 数组与链表对点选择
题型02 结合真实情境 代码挖空填空
02 核心突破练
03 真题溯源练
01 数组与链表对点选择
1.(数组分段遍历,诸暨 2025-12 诊断第 11 题) 利用冒泡排序算法对数组 arr 进行降序排序,并实现了优化措施:如果在某一轮遍历中没有发生元素交换,则提前结束排序。实现该功能的部分程序如下:
arr = [64, 34, 25, 12, 22, 11, 90]
n = len(arr)
for i in range(n-1):
①
for j in range(0,n-i-1):
if ②:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
③:
if not swapped:
break
print("排序后的数组:",arr)
则①②③处填入的正确代码应为()
A.①swapped = False ②arr[j]>arr[j+1] ③swapped = True
B.①swapped = False ②arr[j]<arr[j +1] ③swapped = True
C.①swapped = True ②arr[j]>arr[j +1] ③swapped = False
D.①swapped = True ②arr[j]<arr[j +1] ③swapped = False
2.(next/last 数组模拟链表,诸暨 2025-12 诊断第 12 题) 有如下 python 程序:
n =len(info)
last=[-1]*n
next=[n]*n
for i in range(n):
k = info[i]
if last[k]!=-1:
next[last[k]] = i
last[k] =i
若 info 为[1,2,3,2,3,1],执行程序后,next 的值为()
A.[5, 3, 4, 6,6,6] B.[5, 3, 4,-1,-1,-1] C.[0, 5, 1, 3,2, 4] D.[0, 5, 1, 6,6, 6]
3.(数组保持有序插入,2025-01 浙江选考第 10 题) 数组元素 a [0]-a [n-1] 已按升序排列,现要将 a [pos] 的值加 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]
4.(数组循环移动模拟,2026-01 浙江首考第 12 题) 有如下 Python 程序段:
#获取a的初始值,代码略
i=1
for j in range(1,len(a)):
if a[j]<a[0]:
a[j],a[i]=a[i],a[j]
i+=1
a[0],a[i-1]=a[i-1],a[0]
执行该程序段后,a的值为[2,4,3,5,6,9,7],则下列选项中不可能为a[0]的初始值的是()
A.2 B.5 C.6 D.7
02 结合真实情境 代码挖空填空
1.(一维数组统计,诸暨 2025-12 诊断第 13 (2) 节选)
count=[0]*11
total=[0]*(n+1)
maxscore=0
maxclass=[]
num=len(scores)
for i in range (num):
cls=i//5+1
① ____________ #统计每个得分出现次数
② ____________ #统计班级总分
if scores[i]>maxscore:
maxscore=scores[i]
maxclass=[cls]
elif scores[i]==maxscore and cls not in maxclass:
maxclass.append(cls)
写出划线①、②的代码。
2.(链表节点增删,温州 2026 届 4 月二模 15 )
某车间有多类设备,设备用于承接并完成订单对应的各类生产任务。为减少设备启停带来的损耗,若某订单的完成时刻与后续订单的开始时刻相同,且所需的设备类型一致,则合并订单,安排该设备不间断运行。车间根据合并后的订单,优先分配完成时刻最早的该类设备。每台设备一次只能处理一个订单。请回答下列问题。
(1)某段时间内的订单数据如图a所示,设备数据如图b所示。则分配给104订单的设备编号为 。
(2)定义函数merge,用于处理订单合并。def merge(orders):
res =[]
for i in range(len(orders)):
tp, st, t = orders[i][1], orders[i][2], orders[i][3]
k=-1
for j in range(len(res)-1, -1, -1):
if res[j][0]==tp:
k=j
break
if k!=-1 and res[k][1]+res[k][2]==st:
res[k][2] += t
else:
res.append([tp, st, t])
return res
若 orders 初始为[["101","A",1,1],["102","C",1,3],["103","B",2,4],["104","C",4,3],["105","B”、7,2],["106","C",7,2]],执行 merge(orders)后,
①返回值中订单总数为
②变量k的最终值为
(3)根据订单分配设备,若分配成功,则更新该设备的完成时刻,并将设备信息重新插入到序列的合适位置,若分配失败,则另作处理。程序如下,请在划线处填入合适的代码。
def proc(a,head):
p ,best= -l, head
while best != -l:
if ① :
best = -l
break
if lst{best][1]== a[0] and lst{best][2] <= a[1]:
print("启动的设备编号为:",Ist[best][0])
break
p= best
best = lst[best][3]
if best==-l:
#分配失败,该订单另作处理,代码略
else:
②
if best==head:
head = lst[head][3]
else:
③
p,cur==-1,head
while cur!=-1 and lst[cur][2]<=lst[best][2]:
p= cur
cur = lst[cur][3]
if p ==-1:
lst[best][3]= head
head = best
else:
lstlbest][3]= cur
lst[p][3]= best
return head
‘’’
读取订单信息,存储于orders列表,每个元素包含四个数据项,依次为订单编号、所需设备类型、开始时刻和运行时长。
读取设备信息,存储于1st列表,每个元素包含三个数据项,依次为设备编号、设备类型完成时刻(初始值为0)。设备数量存储于变量 m,代码略。
‘’’
fori in range(m):
lst[i].append(i + 1)
lst[m -1][3]= -1
orders = merge(orders)
head =0
for i in range(len(orders)):
p = proc(orders[i],head)
#输出订单分配后的设备信息,代码略
1.(数组区间处理,温州 2026 届 4 月二模第 10 题) 有如下 Python 程序段:
st=i=0
while i<len(d) - 1:
if d[i]>=d[i+1]:
if i-st+1>2:
st=i+1
i+=1
若 d=[1,3,5,5,2,4,4,6] , 执行该程序段后,st 的值为()
A.3 B.5 C.6 D.7
2.(链表索引数组,2026-01 浙江首考 15 题选择题化截取原题逻辑)
背景:lst 模拟链表,节点[start,end,next],头节点 lst [0];p 代表当前遍历节点下标;num = lst [p][1]-lst [p][0]+1 代表该链表节点对应连续编号区间长度。
bestnum=len(items)+1
bestpre,pre=-1,0
p=lst[0][2]
while p!=-1 and need!=bestnum:
num=lst[p][1]-lst[p][0]+1
if num>=need and num < bestnum:
bestnum=num
bestpre = pre
pre=p
p=lst[p][2]
已知need=3,链表节点区间分别:[201,203]长度 3、[208,212]长度 5,执行循环结束后 bestnum 值为()
A.3 B.4 C.5 D.6
3.(数组逻辑统计,2025-01 浙江选考 13 题数组调度逻辑)
n=6
a=[0]*n
t=0
cnt=0
for i in range(n):
if a[i]>90:
cnt+=1
if a[i]>a[t]:
t=i
若某次采集负载率a=[75,85,88,0,88,87],运行循环结束后 t 的值为()
A.1 B.2 C.4 D.5
4.(链表拆分修改,温州 2026 届 4 月二模 15⑶原题填空)
背景:lst 存储链表,best 为选中节点下标;bestpre 是 best 前驱;need 代表要截取的元素个数;节点格式[设备编号,设备类型,完成时刻,后继指针]。 需求:best 节点原区间长度大于 need,截取 need 个元素留在 best 节点,剩余部分新建节点插入链表。
if bestnum>need:
____________ #修改best节点完成时刻;剩余部分生成新节点
1.某算法的部分流程图如第7题图所示,若n的值为8,数组元素 a[0]至 a[n-1]依次存放 2,3,4,8,5,4,9,6,执行这部分流程后,输出c的值为
A.1
B.2
C.3
D.4
2.(2024-06 浙江选考第 12 题|链表操作) 每个节点包含数据区域和指针区域,h 为头指针。现要按链表顺序将这 n 个节点中的数据依次存放到d[0][0]、d[1][0]…d[n-1][0]中,最终保持节点链接关系不变。实现上述功能的 Python 程序段如下,方框中应填入的正确代码为()
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
A.d[i][1] = d[p][1];d[p][1] = i B.d[p][1] = d[i][1];d[i][1] = p
C.d[i][1] = p;d[p][1] = d[i][1] D.d[p][1] = i;d[i][1] = d[p][1]
3.(2024-06 浙江选考第 12 题|链表操作原题) 每个节点包含数据区域和指针区域,h 为头指针。现要按链表顺序将这 n 个节点中的数据依次存放到d[0][0]、d[1][0]…d[n-1][0]中,最终保持节点链接关系不变。实现上述功能的 Python 程序段如下,方框中应填入的正确代码为()
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
A.d[i][1] = d[p][1];d[p][1] = i B.d[p][1] = d[i][1];d[i][1] = p
C.d[i][1] = p;d[p][1] = d[i][1] D.d[p][1] = i;d[i][1] = d[p][1]
4.某数据序列data中的元素均为小于127的正整数。现在要对data进行加密,处理过程分"变换"和"重排"两步。
"变换"处理方法是用指定的n组序列R0、R1...Rn-1依次对data进行变换。利用R对data进行变换的程是:在data 中查找所有与R.相同的子序列,将找到的每个子序列中的元素值加上R.的长度值Li,并在各子序列前插入一个标记元素(值为127+L),这些子序列及标记元素不再参与后续的变换。如data [3,5,1,6,3,8,7,5,1,8,7],指定的两组序列为[5,1]、[3,8,7],"变换"处理后的data为[3,129,7,3,6,130,6,11,10,129,7,3,8,7]
对data"重排"处理通过给定的shuff函数实现。请回答下列问题:
(1)若data 为[3,5,1,6,3,8,7,5,1,8,7],指定的两组序列为[5,1]、[8,7],经过"变换"处理后,data 中插入的标记元素个数为
(2)"重排"处理的shuff函数如下:
def shuff(data, c): #根据列表c对列表data进行重排
#若列表data的长度不是列表c长度的整数倍,则用0补足,代码略
m=len(c)
s=[0]*m
k=0
while k<len(data):
for i in range(m):
s[i]=data[k+i]
for i in range(m)
data[k+i]=s[c[i]]
k+=m
若data为[3,129,7,3,130,6,11,10],c为[1,3,0,2],调用shuff(data,c)后,data的最后一个元素值为
(3)实现加密功能的部分Python程序如下,请在划线处填入合适的代码。
def compare(data, i, r):
#函数功能:返回data从索引i位置、r从索引0位置开始的连续相等元素的个数
#例如r为[7,3,6],data从索引i位置开始的元素依次为7,6,7,3...,函数返回1
j=0
while j<len(r) and i+ j< len(data):
if ① :
break
else:
j+=1
return j
def trans(data, r, segs):
newsegs=[]
for s in segs:
if s[0]==0:
h=i=s[1]
m=len(r)
whilei+m<=s[2]+1:
if compare(data, i, r)m
if i>h:
newsegs.append([0, h, i-1]) #为newsegs追加一个元素
newsegs.append([m, i, i+m-1])
i+=m
②
else:
i+=1
if h<=s[2]:
newsegs.append([0, h, s[2]])
else:
newsegs.append(s)
return newsegs
def update(data, segs):
for s in segs:
if s[0]!=0:
data.append(0)
p=len(data)-1
for i in range(len(segs)-1,-1,-1):
for j in range(segs[i][2]. segs[i][1]-1,-1):
③
p-=1
if segs[i][0]> 0:
data[p]=127+segs[i][0]
p-=1
#读取待加密数据存入data,读取指定的若干组用于变换的序列存入rs,代码略。
列表 segs 用于记录 data 的变换信息,segs[包含三个元素,segs[i][0]、segs[i][1]、segs[i][2]分别表示data中一个子序列的状态、起始位置和结束位置,如果segs[i][0]为0,则表示该子序列未经过变换。
segs =[[0,0,len(data)-1]]
for r in rs:
segs=trans(data,r, segs) #根据r更新segs
update(data, segs) #利用segs完成对data的变换操作
c=[1,3,0,2]
shuff(data,c)
#输出加密后的data序列,代码略
学科网(北京)股份有限公司1 / 17
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$