第07讲 数组与链表(专项训练)(浙江专用)2027年高考信息技术一轮复习讲练测(浙江专用)

2026-10-23
| 2份
| 28页
| 4人阅读
| 0人下载

内容正文:

第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 学科网(北京)股份有限公司 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $

资源预览图

第07讲 数组与链表(专项训练)(浙江专用)2027年高考信息技术一轮复习讲练测(浙江专用)
1
第07讲 数组与链表(专项训练)(浙江专用)2027年高考信息技术一轮复习讲练测(浙江专用)
2
第07讲 数组与链表(专项训练)(浙江专用)2027年高考信息技术一轮复习讲练测(浙江专用)
3
所属专辑
相关资源
示范课
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。