资源简介 (共52张PPT)第二章 数组与链表验收卷(一) 数组与链表(考试时间40分钟 满分50分)一、选择题(本题共12小题,每小题2分,共24分)B解析 本题主要考查的是数组和链表的特性。查找特定元素,使用单向链表查找时,只能通过头指针进入链表并通过指针链接依次访问,直到找到特定元素,而使用数组查找时,只要使用数组名和下标就能直接访问特定元素,因此,查找特定元素,使用数组比使用单向链表更方便。A.对于需要频繁插入和删除元素的情况,使用单向链表比使用数组合适B.查找特定元素,使用单向链表比使用数组方便C.数组适用于最大元素个数容易确定的情况D.存储相同的元素,使用单向链表比使用数组方便D2.下列关于数组和链表的存储结构与逻辑结构关系的说法,正确的是( )解析 链表的节点结构包括数据域与指针域,指针表示各节点的连接前后顺序,即链表数据的逻辑结构由指针表示,D选项正确。A.链表的存储结构与逻辑结构一致B.数组的存储结构对逻辑结构没有影响C.存放相同数据的数组存储空间大于链表D.链表数据的逻辑结构由指针表示A3.利用5列6行的二维数组qp来记录某试场中的座位编号1~30,m=0qp=[[0 for i in range(5)] for j in range(6)] #建立二维数组并初始赋值为0for i in range(5): for j in range(6): if i %2==0: qp[j][i]=m*6+j+1 else: qp[j][i]=m*6+6-j m=m+1运行上述程序段后,编号17所在的数组元素为( )A.qp[4][2] B.qp[2][4] C.qp[5][3] D.qp[6][1]解析 赋值对象为qp[j][i],即i表示列,j表示行,意味着是按列遍历矩阵,因此第1列为1-6,第2列为m*6+6-j,即12-7递减,第3列为13-18。D4.下列关于链表的叙述中,正确的是( )解析 单链表存储方式地址不连续,元素顺序是任意的,因此答案为D。A.线性链表中的各元素在存储空间中的位置必须是连续的B.线性链表中的表头元素一定存储在其他元素的前面C.线性链表中的各元素在存储空间中的位置不一定是连续的,但表头元素一定存储在其他元素的前面D.线性链表中的各元素在存储空间中的位置不一定是连续的,且各元素的存储顺序也是任意的CA.节点的数据区域用于存放实际需要处理的数据元素B.节点的指针区域用于存放该节点相邻节点的存储地址C.单向链表必须带有数据区域为空的头节点和尾节点D.单向链表中的各个节点在内存中可以非顺序存储解析 选项单向链表的头节点和尾节点可以是单独的数据区域为空的节点,也可以将节点序列中的第1个和最后一个节点作为头节点和尾节点。在Python程序设计时我们通常使用第二种方式,即直接使用带数据区域的节点作为头节点或尾节点来标记和使用。C6.有如下Python程序段:解析 本题考查链表的遍历。条件a[p][1]!=-1表示当前节点的指针区域值为-1,即当前节点为尾节点。当遍历到尾节点时,结束循环。a=[[2,2],[5,3],[3,1],[6,-1],[1,0],[4,2]]p=5while a[p][1]!=-1: print(a[p][0],end=″→″) p=a[p][1]则运行程序后,控制台输出的结果是( )A.4→3→5 B.4→3→2→5→C.4→3→5→ D.4→3→2→57.有下列Python程序段:a=[[1,3],[1,0],[7,1],[4,5],[1,-1],[6,4]]x=1p=pre=head=2if x==a[head][0]:head=a[head][1]else:while p!=-1 :if x==a[p][0]: a[pre][1]=a[p][1]解析 本题考查链表的基本操作。如果链表头节点值为1,直接删除头节点,否则遍历链表,语句a[pre][1]=a[p][1]的作用让节点p的前驱指向他的后继,即删除p节点。程序的功能是删除元素值为1的节点。else: pre=pp=a[p][1]运行该段程序后,a[2][1]的值为( )A.-1 B.0 C.1 D.3D8.采用Python二维列表模拟链表,a=[['A',1],['B',2],['C',3],['D',4],['E',5],['F',-1]]表示链表为:A→B→C→D→E→F→None,有以下Python程序:a=[['A',1],['B',2],['C',3],['D',4],['E',5],['F',-1]]head=0;p=a[head][1]a[head][1]=-1while p!=-1:p=a[p][1]if p==-1:break解析 本题考查链表的基本操作。p的初值为a[head][1],即head的后继,进入循环后,语句p=a[p][1]的功能是向后遍历,让该节点指向头节点,p再向后遍历。A后继的后继是C,当前头节点为C,C指向A;C后继的后继是E,当前头节点为E,E指向C。t=a[p][1]a[p][1]=headhead=pp=t执行以上程序后,以head为首的链表结构为( )A.E→C→A B.A→C→EC.B→D→F D.F→D→BA9.有如下 Python 程序:a=[43,23,87,67,80]queinfo=[]for item in a: k=0 while kif item>=queinfo[k][-1]: breakk+=1 if k==len(queinfo):queinfo.append([item])解析 queinfo初值为空,语句queinfo.append([item])是将一个列表添加到queinfo,因此他是一个二维数组。遍历列表a,在queinfo数组从第0个元素开始,与每个元素最后一个数据项进行比较,如果大于等于元素最后一个数据项,结束比较,此时j肯定在0至len(queinfo)-1之间,若j的值为len(queinfo),说明该元素比queinfo中每个元素的最后一个值均小,则新成一组。Queinfo的值为[[43,87],[23,67,80]]。 else:queinfo[k].append(item)print(len(queinfo))执行该程序段后,输出的结果是( )A.1 B.2 C.3 D.4B10.有如下Python程序段:n=6a=[[0]*n for i in range(n)]for i in range(n): for j in range(i+1): if j!=0 and j!=i: a[i][j]=a[i-1][j-1]+a[i-1][j] else: a[i][j]=1C程序执行后,a[4]的值是( )A.[1,3,3,1,0,0] B.[1,4,6,6,4,1]C.[1,4,6,4,1,0] D.[1,5,10,10,5,1]解析 本题考查二维数组的创建和遍历。先创建一个6行6列的二维数组,遍历二维数组的每一行,内循环从0至i,因此只对二维数组的左下半部分进行赋值。将第1列和主对角线(i和j相等)的数据全部赋值为1,其他数据为上一行的前一个和上一行的当前列之和,因此程序的功能是构建一个杨辉三角。11.有如下 Python程序段:a=[[1,3,6,9],[2,4,7,5],[5,2,3,8]];b=[1]n=len(a)for i in range(n): for j in range(n+1): if ib.append(a[i][j])#b追加一个元素a[i][j]A执行该程序执段后,数组b 中的元素为( )A.[1,3,6,9,7,5,8] B.[3,6 ,9,7 ,5,8]C.[1,3,6,9,2,4,7,5,8] D.[1,3,6,9,4,7,5,8]解析 本题考查二维数组的应用.将二维数组a中下标i12.某Python程序如下:data=[]for i in range(len(a)): data.append([a[i],i+1])data[-1][1]=-1la=head=0t=data[head][1]key,c=2,0while c<3 and t!=-1: if data[t][0]-data[la][0] c+=1 la=t t=data[t][1]B已知执行上述程序后,t的值为6,则数组a的值可能( )A.[4,3,1,6,3,9,3] B.[2,6,5,1,6,4,0]C.[7,5,2,3,2,7,5] D.[2,4,0,1,0,8,4]解析 本题考查链表应用。data是一个链表,t指针从链表的第二个节点开始遍历,1a指针是t节点的前驱,t节点减去前驱节点la的值小于key时,c计数,c的初值为0,计数到3时历结束,也就是整个过程计数3次就结束,执行程序后t的值为6,也就是遍历到最后一个节点时程序才结束。二、非选择题(本题共4小题,共26分)13.(6分)大部分社交软件都有好友推荐的功能,当用户A和用户B不为好友,但他们的共同好友数量超过阈值m时,由系统向用户A推荐用户B。编写Python程序,实现好友推荐功能。生成一个二维数组a记录两者关系,当a[0][2]的值为1时,表示ID1和ID3是好友,值为0则不是好友。运行程序,输入用户ID和共同好友数量超过阈值m,显示每个用户ID的好友及向目标用户推荐的好友列表。程序运行界面如图:共同好友数量超过阈值m:21ID号的好友有:2,3,4,5,6,7,92ID号的好友有:1,3,4,5,6,7,103ID号的好友有:1,2,5,6,7,8,94ID号的好友有:1,2,5,6,7,8,9,105ID号的好友有:1,2,3,4,6,86ID号的好友有:1,2,3,4,5,7,9,107ID号的好友有:1,2,3,4,6,88ID号的好友有:3,4,5,7,9,109ID号的好友有:1,3,4,6,810ID号的好友有:2,4,6,8向用户ID1推荐的共同好友有:[8,10]编写的代码如下:n=10#产生一个n*n的二维数组a,存储两人之间的关系。def Check(a,x,y): #向用户ID为x推荐的阈值为y的好友列表。n=10;ans=0nothy=[]for i in range(n): #查找与x不是好友的朋友编号 if ①____________: nothy.append(i)hy=[]for i in nothy: t=0 for j in range(n): if ②____________: t+=1if t>y: hy.append(i+1)return hy hm=int(input(″输入用户ID:″))m=int(input(″共同好友数量超过阈值m:″)) for i in range(n): s=str(i+1)+″ID号的好友有:″ for j in range(n): if a[i][j]==1: s=s+str(j+1)+″,″ print(s[:-1])③____________print(″向用户ID″,hm,″推荐的共同好友有:″,p)(1)输入用户ID为7,阈值m为4,则推荐的好友是________。(2)请在程序划线处填入合适的代码。答案 (1)5,9 (2)①a[i][x]==0 and x!=i②a[x][j]==1 and a[i][j]==1③p=Check(a,hm,m)解析 (1)在不是好友中选择共同好友超过4的ID,ID10与ID7的共同好友只有4个。(2)①查找与x不是好友的朋友编号,在各个编号中遍历,相当在于二维表格的第x行查找0的列号,但列号不能是x自己。②寻找共同好友,即第x第i行中,值均为1的列号数量。③调用自定义函数查找共同好友。已知14.(6分)某影平台上架新影片时,需要先确定该影片的类型,如喜剧片、动作片、爱情片。确定某影片的类型,可根据已有的样本数据(如图a所示)进行分类。图a电影名称 搞笑镜头 拥抱镜头 打斗镜头 影片类型宝贝当家 45 2 9 喜剧片唐人街探案 23 3 17 喜剧片我的特工 爷爷 6 4 21 动作片…… …… …… …… ……泰坦尼克号 9 39 8 爱情片罗马假日 9 38 2 爱情片新步步惊心 8 34 17 爱情片图b电影名称 搞笑 镜头 拥抱 镜头 打斗 镜头 影片类型美人鱼 19 18 5 ?距离最近的前5部影片为:唐人街探案19.62,罗马假日22.56,新步步惊心22.83,泰坦尼克号23.45,我的特工爷爷24.92,图c请回答下列问题:(1)与《美人鱼》距离最近的前5部影片如图c所示,则该影片属于________(单选,填字母:A.喜剧片 /B.动作片 /C.爱情片)。(2)定义如下mvmin(result,flag)函数,参数result列表存储距离,flag列表存储标记。若result=[43,33,18,25,65],flag=[False,False,True,True,False],则函数的返回值为________。def mvmin(result,flag):mv=10000 #假定result列表元素值不超过10000for i in range(len(result)): if mv>result[i] and flag[i]==False: mv=result[i] pos=ireturn pos(3)实现电影分类的部分Python程序如下,请在划线处填入合适的代码。读取样本影片的镜头数据,存储在data中,每个元素包含5个数据项,分别对应电影名称、搞笑镜头、打斗镜头、拥抱镜头、影片类型。如data=[[″宝贝当家″,45,2,9,″喜剧片″],……],代码略。x=[″美人鱼″,19,18,5]dic={″喜剧片″:0,″动作片″:0,″爱情片″:0}k=5 result=[0]*len(data)for i in range(len(data)):d=0for j in range(1,4): tmp=①________ d+=tmp**2 result[i]=round(d**0.5,2) #结果保留2位小数flag=[False]*len(result)print(″距离最近的前″,k,″部影片为:″)while k>0:p=mvmin(result,flag)flag[p]=True②________print(data[p][0],result[p],end=″,″)③________#统计前k个最近距离的影片中出现频次最多的类型,并输出该影片类型,代码略答案 (1)C (2)1 (3)①data[i][j]-x[j] 或 x[j]-data[i][j] ②dic[data[p][4]]+=1 ③k-=1解析 (1)距离最近的5部影片中,喜剧片1部,爱情片3部分,动作片1部,因此该影片类型为爱情片。(2)在存储标记为False的位置中,查找最小值的索引,43,33,65三个数中最小值索引为1。(3)①遍历所有的样本数据data,计算出“美人鱼”与样本中所有影片的距离。data[i][1]、data[i][2]、data[i][3]分别表示样本数据中搞笑镜头、打斗镜头、拥抱镜头的值,用变量j表示这些下标,计算与x[j]的平方差的和。②调用mvmin函数计算最小距离的索引p,即对应的样本的索引,在数组元素data[p][4]中存储的是该影片的类型,需要对该类型的数量增加1。③处理下一个样本数据。15.(7分)某学校工会举行飞镖大赛,共有n位老师报名参赛,每位选手共掷5支镖,每镖得分为0至10分,选手总分为 5镖成绩之和,每位选手的比赛数据记录在文本文件中,如图a所示。处理要求:数据读入数组 data 中,计算出每位选手的总分,在不改变数据在原数组 data 中的位置的条件下,按总分从高到低输出选手的编号和总分。(1)主程序。采用链表结构处理数据。程序运行结果如图 b所示。请在程序中划线处填入合适的代码。data=readdata(″scores.txt″) #读取数据,计算总分print(″处理前的数据为:\\n″,data)n=len(data)flag=[True]*n #标记数据被使用情况head=findmax() #返回 data 中可使用状态最大数的位置k=headfor i in range(1,n): posi=findmax() data[k].append(posi) ______________data[k].append(-1)print(″处理后的数据为:\\n″,data)print(″从高分到低分输出为:″)output(head)(2)编写readdata函数,功能为从文本文件读取数据,计算出总分,返回列表。代码如下,请在程序中划线处填入合适的代码。def readdata(filename): f=open(filename) line=f.readline() lst=[] while line: #获取每位选手的编号和总分数据 line=line.split(″,″) s=0 for i in range(1,len(line)): __________ lst.append([line[0],s]) line=f.readline()return lst(3)编写findmax函数,功能为返回 data 中可使用状态最大数的位置pos,并设置该数的使用状态为 False。请在程序中划线处填入合适的代码。def findmax(): maxnum=0 for i in range(n): if ①____________: maxnum=data[i][1] pos=i ②____________ return pos答案 (1)k=posi (2)s+=int(line[i])(3)①maxnum②flag[pos]=False (4)q!=-1解析 (1)查找数组中的最大值的位置,利用位置关系串成一个降序链表,最后遍历链表输出。k 是当前元素的位置,posi 是下一个元素的位置,找到的数应该在节点 posi 后面。(2)readdata函数功能是读取“scores.txt”文件,生成一个二维列表。变量s累计的总分。(3)findmax函数找到最大数所在位置,同时将该位置设置为 False。(4)遍历链表,输出节点相关数据域的内容。16.(7分)“抢单”是外卖骑手的日常,当外卖平台上一个新的订单出现时,骑手需要在短时间内考虑是否抢单。平台根据骑手的实际信息,给出是否抢单的建议,若建议抢单则给出到达各个取送点的顺序。平台判断是否抢单的算法设计如下:1)在不改变已有订单各取送点顺序的前提下,将新订单按先取餐后送餐的顺序分别插入原来的路线中,枚举所有新路线;2)计算新路线路程,并进行判断:每个取送点都有一个系统指定时间,若骑手到达该位置时,时间晚于系统指定时间,则该方案无效;3)对新路线进行计算和判断后,删除此次枚举的两个插入位置,还原为初始状态,再继续进行下一次枚举;4)在所有有效方案中,输出总路程最小的方案,若无有效方案,则输出不接单的建议。如果骑手目前无订单在派送中,则插入订单A的方案只有1种,骑手→取餐点A→送餐点A;如果骑手订单中已有1个送餐点A和1个送餐点B,则新订单C有6种插入方案,如下所示,方案1:骑手→取餐点C→送餐点C→送餐点A→送餐点B方案2:骑手→取餐点C→送餐点A→送餐点C→送餐点B方案3:骑手→取餐点C→送餐点A→送餐点B→送餐点C方案4:骑手→送餐点A→取餐点C→送餐点C→送餐点B方案5:骑手→送餐点A→取餐点C→送餐点B→送餐点C方案6:骑手→送餐点A→送餐点B→取餐点C→送餐点C(1)若骑手仅剩3份餐未送(已取餐),路线为:骑手→送餐点A→送餐点B→送餐点C,新的订单出现后,有________种插入方案。(2)定义如下con(tim)函数进行时间格式转换,将24小时制的“时:分”转换为分,如02:30转换为150,请在划线处填上合适代码。def con(tim): t=__________+int(tim[3:]) return t(3)定义totd(riderlist,h)函数,其功能为从头指针h进入链表riderlist,按节点先后顺序计算总路程,并判断能否在系统指定时间内到达各取送点,若到达某一取送点时超时返回-1。若链表riderlist如下,riderlist=[[″u1001″,″119.906033″,″31.014597″,″11:30″,2],[″s″,″119.921439″,″31.023022″,″11:55″,3],[″t″,″119.887850″,″31.022861″,″11:40″,1],[″s″,″119.953836″,″31.021122″,″12:10″,-1]]第1个元素中″u1001″为骑手编号,″119.906033″和″31.014597″,表示骑手实时位置,″11:30″为实时时间,2为下一节点指针,第2个元素开始,第1项若为″t″表示此元素为取餐点信息,若为″s″表示此元素为送餐点信息。调用函数totd(riderlist,h),risderlist的值如上,h为0,则加框处语句最多被执行______次,若将此条件语句改为riderlist[pre][4]!=-1,______(选填:影响/不影响)程序执行。total+=dif total/speed>con(riderlist[cur][3])-con(riderlist[h][3]): return -1else: pre=cur cur=riderlist[pre][4]return round(total,2)(4)实现是否接单判断的Python部分程序如下,请在划线处填入合适的代码。def add(oldlist,x,c): #在x所指节点后插入新节点cc[4]=oldlist[x][4]oldlist.append(c)oldlist[x][4]=len(oldlist)-1return oldlist#读取骑手信息,存储在lit中,代码略tc=[″t″,″119.936506″,″31.008933″,″12:05″,-1] #新订单取餐信息 sc=[″s″,″119.919839″,″31.020183″,″12:22″,-1] #新订单送餐信息ans=[-1,-1,10000]head=0p=headwhile p!=-1:lit=add(lit,p,tc)①____________while q!=-1:lit=add(lit,q,sc)tot=totd(lit,head)if tot!=-1 and ②____________ : ans=[p,q,tot]lit[q][4]=lit[lit[q][4]][4]q=lit[q][4]lit[p][4]=lit[lit[p][4]][4]p=lit[p][4]if ans[2]==10000:print(″不建议接单,不能在系统指定时间内送达。″)else:print(″可以接单,建议各取送点到达顺序依次为:″)#按顺序输出各取送点代码略答案 (1)10 (2)int(tim[0:2])*60 或 int(tim[:2])*60 (3)4 不影响(4)①q=lit[p][4] 或 q=lit[p][-1]②tot解析 本题考查链表的遍历和插入等操作。(1)取餐点一定在送餐点的前面,若有3个送餐点,则可以分别在这3个点的4个地方依次插入取送餐点,则分别有4+3+2+1=10种方案。(2)获取字符串中小时并转换成分钟。(3)4个取送餐点有3段距离,但循环条件需判断4次。cur是当前节点,pre为当前节点的前驱,当前节点为-1时,其前驱的指针区域值也为-1。(4)①节点p遍历链表,在节点p的后面插入取送餐点,因此q的初值为节点p的后继。②变量ans存储了插入点位置及距离,语句ans=[p,q,tot]表示更新了其值,因此条件是新的距离tot小于最短距离ans。验收卷(一) 数组与链表(考试时间40分钟 满分50分)一、选择题(本题共12小题,每小题2分,共24分)1.单向链表与数组都属于线性表,它们都用于存储具有相同属性的数据,下列说法不正确的是( )A.对于需要频繁插入和删除元素的情况,使用单向链表比使用数组合适B.查找特定元素,使用单向链表比使用数组方便C.数组适用于最大元素个数容易确定的情况D.存储相同的元素,使用单向链表比使用数组方便2.下列关于数组和链表的存储结构与逻辑结构关系的说法,正确的是( )A.链表的存储结构与逻辑结构一致B.数组的存储结构对逻辑结构没有影响C.存放相同数据的数组存储空间大于链表D.链表数据的逻辑结构由指针表示3.利用5列6行的二维数组qp来记录某试场中的座位编号1~30,m=0qp=[[0 for i in range(5)] for j in range(6)] #建立二维数组并初始赋值为0for i in range(5): for j in range(6): if i %2==0: qp[j][i]=m*6+j+1 else: qp[j][i]=m*6+6-j m=m+1运行上述程序段后,编号17所在的数组元素为( )A.qp[4][2] B.qp[2][4] C.qp[5][3] D.qp[6][1]4.下列关于链表的叙述中,正确的是( )A.线性链表中的各元素在存储空间中的位置必须是连续的B.线性链表中的表头元素一定存储在其他元素的前面C.线性链表中的各元素在存储空间中的位置不一定是连续的,但表头元素一定存储在其他元素的前面D.线性链表中的各元素在存储空间中的位置不一定是连续的,且各元素的存储顺序也是任意的5.关于单向链表的节点结构,下列说法不正确的是( )A.节点的数据区域用于存放实际需要处理的数据元素B.节点的指针区域用于存放该节点相邻节点的存储地址C.单向链表必须带有数据区域为空的头节点和尾节点D.单向链表中的各个节点在内存中可以非顺序存储6.有如下Python程序段:a=[[2,2],[5,3],[3,1],[6,-1],[1,0],[4,2]]p=5while a[p][1]!=-1: print(a[p][0],end=″→″) p=a[p][1]则运行程序后,控制台输出的结果是( )A.4→3→5 B.4→3→2→5→C.4→3→5→ D.4→3→2→57.有下列Python程序段:a=[[1,3],[1,0],[7,1],[4,5],[1,-1],[6,4]]x=1p=pre=head=2if x==a[head][0]:head=a[head][1]else:while p!=-1 :if x==a[p][0]: a[pre][1]=a[p][1]else: pre=pp=a[p][1]运行该段程序后,a[2][1]的值为( )A.-1 B.0 C.1 D.38.采用Python二维列表模拟链表,a=[['A',1],['B',2],['C',3],['D',4],['E',5],['F',-1]]表示链表为:A→B→C→D→E→F→None,有以下Python程序:a=[['A',1],['B',2],['C',3],['D',4],['E',5],['F',-1]]head=0;p=a[head][1]a[head][1]=-1while p!=-1:p=a[p][1]if p==-1:breakt=a[p][1]a[p][1]=headhead=pp=t执行以上程序后,以head为首的链表结构为( )A.E→C→A B.A→C→EC.B→D→F D.F→D→B9.有如下 Python 程序:a=[43,23,87,67,80]queinfo=[]for item in a: k=0 while kif item>=queinfo[k][-1]: breakk+=1 if k==len(queinfo):queinfo.append([item]) else:queinfo[k].append(item)print(len(queinfo))执行该程序段后,输出的结果是( )A.1 B.2 C.3 D.410.有如下Python程序段:n=6a=[[0]*n for i in range(n)]for i in range(n): for j in range(i+1): if j!=0 and j!=i: a[i][j]=a[i-1][j-1]+a[i-1][j] else: a[i][j]=1程序执行后,a[4]的值是( )A.[1,3,3,1,0,0] B.[1,4,6,6,4,1]C.[1,4,6,4,1,0] D.[1,5,10,10,5,1]11.有如下 Python程序段:a=[[1,3,6,9],[2,4,7,5],[5,2,3,8]];b=[1]n=len(a)for i in range(n): for j in range(n+1): if ib.append(a[i][j])#b追加一个元素a[i][j]执行该程序执段后,数组b 中的元素为( )A.[1,3,6,9,7,5,8]B.[3,6 ,9,7 ,5,8]C.[1,3,6,9,2,4,7,5,8]D.[1,3,6,9,4,7,5,8]12.某Python程序如下:data=[]for i in range(len(a)): data.append([a[i],i+1])data[-1][1]=-1la=head=0t=data[head][1]key,c=2,0while c<3 and t!=-1: if data[t][0]-data[la][0] c+=1 la=t t=data[t][1]已知执行上述程序后,t的值为6,则数组a的值可能( )A.[4,3,1,6,3,9,3] B.[2,6,5,1,6,4,0]C.[7,5,2,3,2,7,5] D.[2,4,0,1,0,8,4]二、非选择题(本题共4小题,共26分)13.(6分)大部分社交软件都有好友推荐的功能,当用户A和用户B不为好友,但他们的共同好友数量超过阈值m时,由系统向用户A推荐用户B。编写Python程序,实现好友推荐功能。生成一个二维数组a记录两者关系,当a[0][2]的值为1时,表示ID1和ID3是好友,值为0则不是好友。运行程序,输入用户ID和共同好友数量超过阈值m,显示每个用户ID的好友及向目标用户推荐的好友列表。程序运行界面如图:共同好友数量超过阈值m:2 1ID号的好友有:2,3,4,5,6,7,9 2ID号的好友有:1,3,4,5,6,7,10 3ID号的好友有:1,2,5,6,7,8,9 4ID号的好友有:1,2,5,6,7,8,9,10 5ID号的好友有:1,2,3,4,6,8 6ID号的好友有:1,2,3,4,5,7,9,10 7ID号的好友有:1,2,3,4,6,8 8ID号的好友有:3,4,5,7,9,10 9ID号的好友有:1,3,4,6,8 10ID号的好友有:2,4,6,8 向用户ID1推荐的共同好友有:[8,10]编写的代码如下:n=10#产生一个n*n的二维数组a,存储两人之间的关系。def Check(a,x,y): #向用户ID为x推荐的阈值为y的好友列表。n=10;ans=0nothy=[]for i in range(n): #查找与x不是好友的朋友编号 if ①____________: nothy.append(i)hy=[]for i in nothy: t=0 for j in range(n): if ②____________: t+=1if t>y: hy.append(i+1)return hy hm=int(input(″输入用户ID:″))m=int(input(″共同好友数量超过阈值m:″)) for i in range(n): s=str(i+1)+″ID号的好友有:″ for j in range(n): if a[i][j]==1: s=s+str(j+1)+″,″ print(s[:-1])③____________print(″向用户ID″,hm,″推荐的共同好友有:″,p)(1)输入用户ID为7,阈值m为4,则推荐的好友是________。(2)请在程序划线处填入合适的代码。14.(6分)某影平台上架新影片时,需要先确定该影片的类型,如喜剧片、动作片、爱情片。确定某影片的类型,可根据已有的样本数据(如图a所示)进行分类。某分类算法如下:计算该影片与样本中各影片分镜头的相似度,相似度可用距离公式来表示,例如“美人鱼”各分镜头数据如图b所示,其与“宝贝当家”影片的距离为。用该方法计算出“美人鱼”与样本中所有影片的距离,选取前k个最近距离的影片,统计出现频次最多的影片类型,即为该影片的类型。电影名称 搞笑镜头 拥抱镜头 打斗镜头 影片类型宝贝当家 45 2 9 喜剧片唐人街 探案 23 3 17 喜剧片我的特工 爷爷 6 4 21 动作片…… …… …… …… ……泰坦尼克号 9 39 8 爱情片罗马假日 9 38 2 爱情片新步步惊心 8 34 17 爱情片图a电影名称 搞笑 镜头 拥抱 镜头 打斗 镜头 影片 类型美人鱼 19 18 5 ?图b距离最近的前5部影片为: 唐人街探案19.62,罗马假日22.56,新步步惊心22.83,泰坦尼克号23.45,我的特工爷爷24.92,图c请回答下列问题:(1)与《美人鱼》距离最近的前5部影片如图c所示,则该影片属于________(单选,填字母:A.喜剧片 /B.动作片 /C.爱情片)。(2)定义如下mvmin(result,flag)函数,参数result列表存储距离,flag列表存储标记。若result=[43,33,18,25,65],flag=[False,False,True,True,False],则函数的返回值为________。def mvmin(result,flag):mv=10000 #假定result列表元素值不超过10000for i in range(len(result)): if mv>result[i] and flag[i]==False: mv=result[i] pos=ireturn pos(3)实现电影分类的部分Python程序如下,请在划线处填入合适的代码。读取样本影片的镜头数据,存储在data中,每个元素包含5个数据项,分别对应电影名称、搞笑镜头、打斗镜头、拥抱镜头、影片类型。如data=[[″宝贝当家″,45,2,9,″喜剧片″],……],代码略。x=[″美人鱼″,19,18,5]dic={″喜剧片″:0,″动作片″:0,″爱情片″:0}k=5 result=[0]*len(data)for i in range(len(data)):d=0for j in range(1,4): tmp=①________ d+=tmp**2 result[i]=round(d**0.5,2) #结果保留2位小数flag=[False]*len(result)print(″距离最近的前″,k,″部影片为:″)while k>0:p=mvmin(result,flag)flag[p]=True②________print(data[p][0],result[p],end=″,″)③________#统计前k个最近距离的影片中出现频次最多的类型,并输出该影片类型,代码略15.(7分)某学校工会举行飞镖大赛,共有n位老师报名参赛,每位选手共掷5支镖,每镖得分为0至10分,选手总分为 5镖成绩之和,每位选手的比赛数据记录在文本文件中,如图a所示。处理要求:数据读入数组 data 中,计算出每位选手的总分,在不改变数据在原数组 data 中的位置的条件下,按总分从高到低输出选手的编号和总分。(1)主程序。采用链表结构处理数据。程序运行结果如图 b所示。请在程序中划线处填入合适的代码。data=readdata(″scores.txt″) #读取数据,计算总分print(″处理前的数据为:\\n″,data)n=len(data)flag=[True]*n #标记数据被使用情况head=findmax() #返回 data 中可使用状态最大数的位置k=headfor i in range(1,n): posi=findmax() data[k].append(posi) ______________data[k].append(-1)print(″处理后的数据为:\\n″,data)print(″从高分到低分输出为:″)output(head)(2)编写readdata函数,功能为从文本文件读取数据,计算出总分,返回列表。代码如下,请在程序中划线处填入合适的代码。def readdata(filename): f=open(filename) line=f.readline() lst=[] while line: #获取每位选手的编号和总分数据 line=line.split(″,″) s=0 for i in range(1,len(line)): __________ lst.append([line[0],s]) line=f.readline()return lst(3)编写findmax函数,功能为返回 data 中可使用状态最大数的位置pos,并设置该数的使用状态为 False。请在程序中划线处填入合适的代码。def findmax(): maxnum=0 for i in range(n): if ①____________: maxnum=data[i][1] pos=i ②____________ return pos(4)编写output函数,功能为从高分到低分输出选手的信息。代码如下,加框处的代码有误,请改正。def output(q): while : print(data[q][0:2],end=″>>″) q=data[q][2]print(″NULL″) #表示结束16.(7分)“抢单”是外卖骑手的日常,当外卖平台上一个新的订单出现时,骑手需要在短时间内考虑是否抢单。平台根据骑手的实际信息,给出是否抢单的建议,若建议抢单则给出到达各个取送点的顺序。平台判断是否抢单的算法设计如下:1)在不改变已有订单各取送点顺序的前提下,将新订单按先取餐后送餐的顺序分别插入原来的路线中,枚举所有新路线;2)计算新路线路程,并进行判断:每个取送点都有一个系统指定时间,若骑手到达该位置时,时间晚于系统指定时间,则该方案无效;3)对新路线进行计算和判断后,删除此次枚举的两个插入位置,还原为初始状态,再继续进行下一次枚举;4)在所有有效方案中,输出总路程最小的方案,若无有效方案,则输出不接单的建议。如果骑手目前无订单在派送中,则插入订单A的方案只有1种,骑手→取餐点A→送餐点A;如果骑手订单中已有1个送餐点A和1个送餐点B,则新订单C有6种插入方案,如下所示,方案1:骑手→取餐点C→送餐点C→送餐点A→送餐点B方案2:骑手→取餐点C→送餐点A→送餐点C→送餐点B方案3:骑手→取餐点C→送餐点A→送餐点B→送餐点C方案4:骑手→送餐点A→取餐点C→送餐点C→送餐点B方案5:骑手→送餐点A→取餐点C→送餐点B→送餐点C方案6:骑手→送餐点A→送餐点B→取餐点C→送餐点C(1)若骑手仅剩3份餐未送(已取餐),路线为:骑手→送餐点A→送餐点B→送餐点C,新的订单出现后,有________种插入方案。(2)定义如下con(tim)函数进行时间格式转换,将24小时制的“时:分”转换为分,如02:30转换为150,请在划线处填上合适代码。def con(tim): t=__________+int(tim[3:]) return t(3)定义totd(riderlist,h)函数,其功能为从头指针h进入链表riderlist,按节点先后顺序计算总路程,并判断能否在系统指定时间内到达各取送点,若到达某一取送点时超时返回-1。若链表riderlist如下,riderlist=[[″u1001″,″119.906033″,″31.014597″,″11:30″,2],[″s″,″119.921439″,″31.023022″,″11:55″,3],[″t″,″119.887850″,″31.022861″,″11:40″,1],[″s″,″119.953836″,″31.021122″,″12:10″,-1]]第1个元素中″u1001″为骑手编号,″119.906033″和″31.014597″,表示骑手实时位置,″11:30″为实时时间,2为下一节点指针,第2个元素开始,第1项若为″t″表示此元素为取餐点信息,若为″s″表示此元素为送餐点信息。调用函数totd(riderlist,h),risderlist的值如上,h为0,则加框处语句最多被执行______次,若将此条件语句改为riderlist[pre][4]!=-1,______(选填:影响/不影响)程序执行。def totd(riderlist,h):speed=0.3 #speed为骑手每分钟公里数total=0pre=hcur=riderlist[pre][4]while :#计算pre与cur两个节点所在位置间的路程,存储在变量d中total+=dif total/speed>con(riderlist[cur][3])-con(riderlist[h][3]): return -1else: pre=cur cur=riderlist[pre][4]return round(total,2)(4)实现是否接单判断的Python部分程序如下,请在划线处填入合适的代码。def add(oldlist,x,c): #在x所指节点后插入新节点cc[4]=oldlist[x][4]oldlist.append(c)oldlist[x][4]=len(oldlist)-1return oldlist#读取骑手信息,存储在lit中,代码略tc=[″t″,″119.936506″,″31.008933″,″12:05″,-1] #新订单取餐信息 sc=[″s″,″119.919839″,″31.020183″,″12:22″,-1] #新订单送餐信息ans=[-1,-1,10000]head=0p=headwhile p!=-1:lit=add(lit,p,tc)①____________while q!=-1:lit=add(lit,q,sc)tot=totd(lit,head)if tot!=-1 and ②____________ : ans=[p,q,tot]lit[q][4]=lit[lit[q][4]][4]q=lit[q][4]lit[p][4]=lit[lit[p][4]][4]p=lit[p][4]if ans[2]==10000:print(″不建议接单,不能在系统指定时间内送达。″)else:print(″可以接单,建议各取送点到达顺序依次为:″)#按顺序输出各取送点代码略验收卷(一) 数组与链表1.B [本题主要考查的是数组和链表的特性。查找特定元素,使用单向链表查找时,只能通过头指针进入链表并通过指针链接依次访问,直到找到特定元素,而使用数组查找时,只要使用数组名和下标就能直接访问特定元素,因此,查找特定元素,使用数组比使用单向链表更方便。]2.D [链表的节点结构包括数据域与指针域,指针表示各节点的连接前后顺序,即链表数据的逻辑结构由指针表示,D选项正确。]3.A [赋值对象为qp[j][i],即i表示列,j表示行,意味着是按列遍历矩阵,因此第1列为1-6,第2列为m*6+6-j,即12-7递减,第3列为13-18。]4.D [单链表存储方式地址不连续,元素顺序是任意的,因此答案为D。]5.C [选项单向链表的头节点和尾节点可以是单独的数据区域为空的节点,也可以将节点序列中的第1个和最后一个节点作为头节点和尾节点。在Python程序设计时我们通常使用第二种方式,即直接使用带数据区域的节点作为头节点或尾节点来标记和使用。]6.C [本题考查链表的遍历。条件a[p][1]!=-1表示当前节点的指针区域值为-1,即当前节点为尾节点。当遍历到尾节点时,结束循环。]7.D [本题考查链表的基本操作。如果链表头节点值为1,直接删除头节点,否则遍历链表,语句a[pre][1]=a[p][1]的作用让节点p的前驱指向他的后继,即删除p节点。程序的功能是删除元素值为1的节点。]8.A [本题考查链表的基本操作。p的初值为a[head][1],即head的后继,进入循环后,语句p=a[p][1]的功能是向后遍历,让该节点指向头节点,p再向后遍历。A后继的后继是C,当前头节点为C,C指向A;C后继的后继是E,当前头节点为E,E指向C。]9.B [queinfo初值为空,语句queinfo.append([item])是将一个列表添加到queinfo,因此他是一个二维数组。遍历列表a,在queinfo数组从第0个元素开始,与每个元素最后一个数据项进行比较,如果大于等于元素最后一个数据项,结束比较,此时j肯定在0至len(queinfo)-1之间,若j的值为len(queinfo),说明该元素比queinfo中每个元素的最后一个值均小,则新成一组。Queinfo的值为[[43,87],[23,67,80]]。]10.C [本题考查二维数组的创建和遍历。先创建一个6行6列的二维数组,遍历二维数组的每一行,内循环从0至i,因此只对二维数组的左下半部分进行赋值。将第1列和主对角线(i和j相等)的数据全部赋值为1,其他数据为上一行的前一个和上一行的当前列之和,因此程序的功能是构建一个杨辉三角。]11.A [本题考查二维数组的应用.将二维数组a中下标i12.B [本题考查链表应用。data是一个链表,t指针从链表的第二个节点开始遍历,1a指针是t节点的前驱,t节点减去前驱节点la的值小于key时,c计数,c的初值为0,计数到3时历结束,也就是整个过程计数3次就结束,执行程序后t的值为6,也就是遍历到最后一个节点时程序才结束。]13.(1)5,9 (2)①a[i][x]==0 and x!=i②a[x][j]==1 and a[i][j]==1③p=Check(a,hm,m)解析 (1)在不是好友中选择共同好友超过4的ID,ID10与ID7的共同好友只有4个。(2)①查找与x不是好友的朋友编号,在各个编号中遍历,相当在于二维表格的第x行查找0的列号,但列号不能是x自己。②寻找共同好友,即第x第i行中,值均为1的列号数量。③调用自定义函数查找共同好友。14.(1)C (2)1 (3)①data[i][j]-x[j] 或 x[j]-data[i][j]②dic[data[p][4]]+=1 ③k-=1解析 (1)距离最近的5部影片中,喜剧片1部,爱情片3部分,动作片1部,因此该影片类型为爱情片。(2)在存储标记为False的位置中,查找最小值的索引,43,33,65三个数中最小值索引为1。(3)①遍历所有的样本数据data,计算出“美人鱼”与样本中所有影片的距离。data[i][1]、data[i][2]、data[i][3]分别表示样本数据中搞笑镜头、打斗镜头、拥抱镜头的值,用变量j表示这些下标,计算与x[j]的平方差的和。②调用mvmin函数计算最小距离的索引p,即对应的样本的索引,在数组元素data[p][4]中存储的是该影片的类型,需要对该类型的数量增加1。③处理下一个样本数据。15.(1)k=posi (2)s+=int(line[i])(3)①maxnum(4)q!=-1解析 (1)查找数组中的最大值的位置,利用位置关系串成一个降序链表,最后遍历链表输出。k 是当前元素的位置,posi 是下一个元素的位置,找到的数应该在节点 posi 后面。(2)readdata函数功能是读取“scores.txt”文件,生成一个二维列表。变量s累计的总分。(3)findmax函数找到最大数所在位置,同时将该位置设置为 False。(4)遍历链表,输出节点相关数据域的内容。16.(1)10 (2)int(tim[0:2])*60 或 int(tim[:2])*60 (3)4 不影响 (4)①q=lit[p][4] 或 q=lit[p][-1] ②tot解析 本题考查链表的遍历和插入等操作。(1)取餐点一定在送餐点的前面,若有3个送餐点,则可以分别在这3个点的4个地方依次插入取送餐点,则分别有4+3+2+1=10种方案。(2)获取字符串中小时并转换成分钟。(3)4个取送餐点有3段距离,但循环条件需判断4次。cur是当前节点,pre为当前节点的前驱,当前节点为-1时,其前驱的指针区域值也为-1。(4)①节点p遍历链表,在节点p的后面插入取送餐点,因此q的初值为节点p的后继。②变量ans存储了插入点位置及距离,语句ans=[p,q,tot]表示更新了其值,因此条件是新的距离tot小于最短距离ans。 展开更多...... 收起↑ 资源列表 验收卷(一) 数组与链表.docx 验收卷(一) 数组与链表.pptx