資源簡介 驗(yàn)收卷(五) 綜合練習(xí)(A)(考試時(shí)間40分鐘 滿分50分)一、選擇題(本題共12小題,每小題2分,共24分)1.下列關(guān)于數(shù)據(jù)結(jié)構(gòu)與算法效率的描述,不正確的是( )A.隊(duì)列和棧都是一種線性表,但兩者有不相同的特性B.采用相同公式求解n!,使用迭代算法比遞歸算法的算法效率高C.使用數(shù)組結(jié)構(gòu)在進(jìn)行數(shù)據(jù)插入和刪除操作時(shí),一定會(huì)引起數(shù)據(jù)移動(dòng)D.某單向鏈表(節(jié)點(diǎn)數(shù)>2)設(shè)有頭尾指針,在刪除該鏈表尾節(jié)點(diǎn)時(shí)需要遍歷多個(gè)節(jié)點(diǎn)2.約定:T操作是指在隊(duì)列中1個(gè)元素出隊(duì)后再入隊(duì),E操作是指將1個(gè)元素入隊(duì),P操作是指隊(duì)列中1個(gè)元素出隊(duì),隊(duì)首指針head和隊(duì)尾指針tail初始值均為0。則經(jīng)過EETPETEP系列操作后,隊(duì)首指針head和隊(duì)尾指針tail的值分別為( )A.3 4 B.3 5 C.4 5 D.4 63.如果一個(gè)棧初始時(shí)為空,且當(dāng)前棧中的元素從棧底到棧頂依次為“d,e,f,g”,已知元素p已經(jīng)出棧,則入棧順序不可能是( )A.d,e,f,g,p B.p,d,e,f,gC.d,e,p,f,g D.d,e,g,p,f4.已知一棵完全二叉樹的節(jié)點(diǎn)總數(shù)為 12,則有關(guān)該二叉樹的說法正確的是( )A.樹的度為12 B.樹的層數(shù)為3C.葉子節(jié)點(diǎn)數(shù)為5 D.最后一層有5個(gè)節(jié)點(diǎn)5.某二叉樹的樹形結(jié)構(gòu)如圖所示,其中序遍歷結(jié)果為FDGBAEC。若補(bǔ)全為完全二叉樹后,按從上到下、自左往右的順序用一維數(shù)組a存儲(chǔ),其中根節(jié)點(diǎn)存儲(chǔ)于元素a[0]中,則元素a[6]的值為( )A.D B.F C.G D.C6.有如下Python 程序段:import randomq=[0]*5head,tail=0,0for i in range(5): if random.randint(0,i)%2==0: q[tail]=random.randint(1,9) #隨機(jī)生成1到9之間的整數(shù) elif head q[tail]=q[head] head+=1 tail+=1print(q)執(zhí)行該程序段后,列表q 的值不可能是( )A.[1,0,1,0,9] B.[5,4,3,2,1]C.[5,8,3,0,0] D.[5,5,6,0,6]7.有如下 Python程序段:a=[21,5,10,9,18,10,5,18,12,11]n=len(a)st=[0]*n; top=-1for i in range(n): if top==-1: top+=1 st[top]=a[i] else: if a[i]%2==0: while top>-1 and a[i]>st[top]: top-=1 top+=1 st[top]=a[i]while top>-1: print(st[top],end=″ ″) top-=1執(zhí)行該程序段后,輸出結(jié)果為( )A.12 18 18 21 B.18 18 12C.21 18 18 12 D.11 12 18 18 218.定義如下函數(shù):def chg(k): if k==-1: return ″″ else: c=chr(ord(″a″)+k) if k%2==1: return c+chg(k-1) else: return chg(k-1)+c執(zhí)行語句m=chg(4)后,m的值為( )A.″e(cuò)cabd″ B.″dbace″ C.″abcde″ D.″e(cuò)dcba″9.下面Python 程序運(yùn)行后,輸出結(jié)果不可能的是( )from random import randinta=[3,4,5,6,7,8]def f(x): if x<2: return a[x]+f(2*x+randint(1,3)) else: return a[x]A.8 B.9 C.10 D.1310.列表a中存儲(chǔ)了8個(gè)元素,即a[0],a[1],…,a[7],有如下Python程序段:n=8for i in range(n-1): for j in range(n-1,i,-1): if a[j] a[j-1],a[j]=a[j],a[j-1]該程序段實(shí)現(xiàn)的是( )A.a[0]到a[7]升序排序B.a[4]到a[7]升序排序C.a[0]到a[7]的數(shù)據(jù)對(duì)4取余之后升序排序D.a[0]到a[3]、a[4]到a[7]分別升序排序11.如下 Python 程序段:import randoma=[1,3,5,7,9,11,13,15]key=random.randint(1,8)*2i,j=0,len(a)-1s=0while i<=j(luò): m=(i+j+1)∥2 if a[m]==key: break if a[m]>key: j=m-1;s-=1 else: i=m+1;s+=1print(s)上述程序執(zhí)行完以后,s 的值可能有( )A.4 種 B.5種 C.7種 D.8 種12.將鏈表中的奇數(shù)節(jié)點(diǎn)和偶數(shù)節(jié)點(diǎn)分別排在一起,奇數(shù)節(jié)點(diǎn)和偶數(shù)節(jié)點(diǎn)的相對(duì)順序不變。如原始鏈表為,新鏈表為。部分程序如下:#讀入鏈表,存儲(chǔ)在列表a中,head存儲(chǔ)鏈表的頭節(jié)點(diǎn)odd=headeven=a[odd][1]tmp=evenwhile a[odd][1]!=-1 and a[even][1]!=-1:a[odd][1]=tmp上述程序段中方框處可選的語句為①odd=a[odd][1]②even=a[even][1]③a[odd][1]=a[even][1]④a[even][1]=a[odd][1]則方框處語句依次為( )A.①③②④ B.①②③④ C.③②④① D.③①④②二、非選擇題(本題共3小題,共26分)13.(6分)疫情防控期間,某工廠為了將流水線上已生產(chǎn)的口罩及時(shí)裝箱,并盡量分配給更多的疫情地區(qū),需要設(shè)計(jì)一個(gè)程序?qū)崿F(xiàn)自動(dòng)化裝箱。裝箱要求為:流水線上生產(chǎn)的每包口罩?jǐn)?shù)量有可能不同,裝入箱子的口罩必須為流水線上連續(xù)的若干包,每箱內(nèi)的口罩?jǐn)?shù)量必須相同,在已知每包口罩?jǐn)?shù)量和口罩總包數(shù)的前提下,裝盡可能多的箱子。例l:某流水線上有8包口罩,每包口罩的數(shù)量如下表:包序號(hào) 1 2 3 4 5 6 7 8 每箱 數(shù)量每包數(shù)量 12 3 9 6 6 9 3 12箱號(hào) (方案1) 1 2 2 3 3 4 4 5 12箱號(hào) (方案2) 1 1 2 2 3 3 4 4 15箱號(hào) (方案3) 1 1 1 1 2 2 2 2 30在上述情況下,有3種分箱方案,方案1為最優(yōu)方案。例2:某流水線上有8包口罩,每包口罩的數(shù)量如下表:序號(hào) 1 2 3 4 5 6 7 8數(shù)量 1 3 5 7 9 11 13 15在上述情況下,沒有符合要求的裝箱方案。按照上述要求,編寫一個(gè)Python程序,功能如下:讀取流水線上每包口罩的數(shù)量,輸出分箱結(jié)果,若存在裝箱方案,則輸出最多的裝箱數(shù),否則輸出“無方案”。程序界面如圖所示。包編號(hào):1 2 3 4 5 6 7 8 包數(shù)量:12 3 9 6 6 9 3 12 方案1每箱12包,箱號(hào):1—1,2—3,4—5,6—7,8—8 方案2每箱15包,箱號(hào):1—2,3—4,5—6,7—8 方案3每箱30包,箱號(hào):1—4,5—8 總共方案數(shù)為3,第一種方案最佳。(1)假如流水線上生產(chǎn)的每包口罩?jǐn)?shù)量依次為“16,5,3,8,7,9”,按照上述裝箱要求,則裝箱結(jié)果為________________。(2)代碼如下,請(qǐng)?jiān)诔绦騽澗€處填入合適的代碼。def F(x): #數(shù)字按固定長度輸出 return (″ ″+str(x))[-5:]def Sa(a,h,t): #將數(shù)組索引號(hào)h至t-1之間的數(shù)值相加。 s=0 for i in range(h,t): s+=a[i] return s#讀取各包中口罩?jǐn)?shù)量到數(shù)組a,并輸出,代碼略maxa=0;suma=0for i in a: #統(tǒng)計(jì)口罩?jǐn)?shù)量最多的包編號(hào)和累加各包口罩?jǐn)?shù)量。 if i>maxa: maxa=i ①____________m=0for i in range(maxa,suma): xh=[] head=0;tail=1 while tail<=n: f=False t=Sa(a,head,tail)if t ②____________ elif t==i: xh.append(tail-1) f=True head=tail ③____________ else: break if f: m+=1 s=″方案″+str(m)+″每箱″+str(i)+″包,箱號(hào):1-″ for j in xh: s=s+str(j+1)+″,″+str(j+2)+″-″ print(s[:-3])14.(10分)某彈珠游戲,彈珠從起點(diǎn)到終點(diǎn)需要經(jīng)過若干節(jié)點(diǎn)(不存在繞圈現(xiàn)象,且保證可以到達(dá)),但方案可能不唯一。各節(jié)點(diǎn)關(guān)系如圖a所示,尋找線路的方法:第1輪節(jié)點(diǎn)A進(jìn)棧,作為當(dāng)前節(jié)點(diǎn),同時(shí)對(duì)A作起點(diǎn)標(biāo)志為真操作,發(fā)現(xiàn)有B、D可以連通,B和D分別進(jìn)棧,棧頂為D;第2輪以D為當(dāng)前節(jié)點(diǎn),對(duì)D作起點(diǎn)標(biāo)志為真操作,從該節(jié)點(diǎn)出發(fā),枚舉所有的路線,直到到達(dá)終點(diǎn)。找到終點(diǎn)后,枚舉棧中節(jié)點(diǎn),查找起點(diǎn)標(biāo)志為真的節(jié)點(diǎn),輸出可以從起點(diǎn)到終點(diǎn)達(dá)到的線路;接著對(duì)當(dāng)前節(jié)點(diǎn)作出棧處理,往前查找一個(gè)出棧標(biāo)志為假的節(jié)點(diǎn),繼續(xù)重復(fù)查找,直到棧中元素為空。用數(shù)組存儲(chǔ)各節(jié)點(diǎn)信息,節(jié)點(diǎn)A、B、C、D、E、F、G、H分別編號(hào)為0~7。數(shù)值1表示表格中左側(cè)節(jié)點(diǎn)可達(dá)上方節(jié)點(diǎn),數(shù)值0表示無法抵達(dá)。程序運(yùn)行的結(jié)果如圖所示,請(qǐng)?jiān)趧澗€處填入合適的代碼。路徑1:A,D,G,H 路徑2:A,D,E,F(xiàn),H 路徑3:A,D,E,C,F(xiàn),H 路徑4:A,B,C,F(xiàn),H(1)起點(diǎn)為D,終點(diǎn)為F,經(jīng)過節(jié)點(diǎn)數(shù)最少的線路圖為________。(2)實(shí)現(xiàn)上述功能的部分Python程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。n=8#n為總的節(jié)點(diǎn)數(shù),讀取n*n個(gè)節(jié)點(diǎn)之間的信息,存儲(chǔ)在二維數(shù)組 a中,若a[i][j]值為1,表示i節(jié)點(diǎn)到j(luò)節(jié)點(diǎn)可達(dá)。代碼略。st=[0]*nst[0]=0;top=0 #構(gòu)建一個(gè)n個(gè)元素的棧f=[False]*n #是否以該節(jié)點(diǎn)為起點(diǎn)向后查找過tot=0 #記錄可行路徑的數(shù)量while top!=-1:①________f[cur]=True for i in range(n): if a[cur][i]==1 : if i==n-1: tot+=1 s=″″;j=0 while j<=top: if ②________: s=s+str(chr(st[j]+65))+″,″ j+=1 print(″路徑″+str(tot)+″:″+s+chr(64+n)) top-=1 while top>=0 and f[st[top]]: top-=1 else: top+=1 ③________15.(10分)王老師組織同學(xué)參加答題游戲,由“A”,“B”,“C”,“D”4個(gè)小組參與游戲,每個(gè)小組由k名學(xué)生組成,由1人代表小組答題。抽簽確定開始的小組,每一輪按A→B→C→D→A順序輪流作答,每答對(duì)一題加10分,每個(gè)選手答錯(cuò)一題即遭淘汰,由同組下一個(gè)選手補(bǔ)上,若該組所有選手都已淘汰則該組即遭淘汰,其他小組繼續(xù)輪流作答,直到剩下最后一組,即為獲勝小組,若最后一輪沒有小組幸存,則分?jǐn)?shù)最高的小組獲勝。(1)若每組有兩個(gè)選手,從A組開始,經(jīng)過3輪答題,答題結(jié)果為“TFTF”,“FFFT”,“FTF”(答對(duì)用T表示,答錯(cuò)用F表示),則獲勝的小組是______。(2)王老師用鏈表數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)了答題游戲的算法,并用 Python 編寫程序模擬,實(shí)現(xiàn)了輸入每組人數(shù),隨機(jī)產(chǎn)生開始的小組,輸入每輪答題的情況,輸出最后獲勝的隊(duì)伍。該程序的 Python 代碼如下,請(qǐng)?jiān)趧澗€處填入合適的代碼,完善程序。def findmax(score): #findmax 函數(shù)功能是在 4 個(gè)小組查找分?jǐn)?shù)最高的小組并輸出,代碼略def printlist(head): #輸出當(dāng)前剩余小組的得分情況 print(dlist[head][0],″組得分是″,score[dlist[head][0]]) cur=①________ while cur!=head:print(dlist[cur][0],″組得分是″,score[dlist[cur][0]])cur=dlist[cur][1]k=int(input(″輸入每個(gè)組的人數(shù):″))code=″ABCD″dlist=[[code[i],i+1] for i in range(4) ] #初始化鏈表 dlistdlist[3][1]=②________head=randint(0,3) #隨機(jī)產(chǎn)生開始的小組print(″從″,code[head],″開始答題″)number={} #存儲(chǔ)每組剩余替補(bǔ)人數(shù)score={} #存儲(chǔ)每組得分?jǐn)?shù)據(jù)for i in dlist: number[i[0]]=k-1 score[i[0]]=0cur=headpre=(head-1)%4left=4while left>1: ans=input(″輸入本輪答題情況″) for j in ans: if j==″T″: score[dlist[cur][0]]+=10 pre=dlist[pre][1] cur=dlist[cur][1] else: if number[dlist[cur][0]]!=0:#該組還有替補(bǔ)選手,則繼續(xù)參賽 number[dlist[cur][0]]-=1 pre=dlist[pre][1] cur=dlist[cur][1] else: #在鏈表中刪除當(dāng)前節(jié)點(diǎn) if cur==head: head=dlist[cur][1] print(dlist[cur][0],″組被淘汰″) cur=dlist[cur][1] left-=1 if left!=0:print(″剩余小組得分情況″)printlist(head)if __④________: print(″最終獲勝的組是:″,dlist[head][0])else:findmax(score)驗(yàn)收卷(五) 綜合練習(xí)(A)1.C [本題考查不同數(shù)據(jù)結(jié)構(gòu)的特性和算法描述。A選項(xiàng)隊(duì)列和棧都是一種線性表,隊(duì)列的特性是先進(jìn)先出,棧的特性是先進(jìn)后出。B選項(xiàng)遞歸求 n!要遞推和回歸兩個(gè)階段(分解問題,逐級(jí)返回),迭代求 n!循環(huán)代碼中參與運(yùn)算的變量作為下一次循環(huán)計(jì)算的初始值。當(dāng) n 越大,迭代算法的效率明顯高于遞歸算法。C選項(xiàng)使用數(shù)組這種數(shù)組結(jié)構(gòu)在數(shù)組尾部進(jìn)行數(shù)據(jù)插入和刪除操作時(shí),不會(huì)引起數(shù)據(jù)移動(dòng);D選項(xiàng)鏈表的操作需要從頭指針開始,遍歷到需要操作的節(jié)點(diǎn),因?yàn)槟硢蜗蜴湵?節(jié)點(diǎn)數(shù)>2),所以在對(duì)該鏈表進(jìn)行刪除尾節(jié)點(diǎn)的操作時(shí)需要遍歷從頭指針開始到尾指針等多個(gè)節(jié)點(diǎn)。]2.D [本題考查隊(duì)列的基本操作。T操作既有入隊(duì),又有出隊(duì),因此共有6次入隊(duì),4次出隊(duì),每次出隊(duì)和入隊(duì),指針分別加1。]3.D [本題主要考查的是棧的入棧和出棧操作。已知當(dāng)前棧中的元素從棧底到棧頂依次為“d,e,f,g”,說明入棧順序?yàn)椤癲、e、f、g”,而元素f的進(jìn)棧順序則沒有要求,因?yàn)樵豥進(jìn)棧可直接出棧,因此,ABC選項(xiàng)都有可能,D選項(xiàng)不可能是入棧順序,因?yàn)樵豧應(yīng)在元素g之前入棧。]4.D [本題考查二叉樹的基本性質(zhì)。符合完全二叉樹的兩個(gè)條件為:①只有最下二層中的節(jié)點(diǎn)度數(shù)小于2;②最下一層的葉子節(jié)點(diǎn)都依次排列在該層最左邊位置。A選項(xiàng)度指樹的最大節(jié)點(diǎn)數(shù)。B選項(xiàng)若為滿二叉樹,第3層及前面所有節(jié)點(diǎn)數(shù)和為7,因此至少4層。C選項(xiàng)最后一層上有5個(gè)節(jié)點(diǎn),即有葉子節(jié)點(diǎn)數(shù)為5,但第3層上還有一個(gè)葉子節(jié)點(diǎn)。]5.D [元素a[6]位于二叉樹從上至下,從左到右第7個(gè)位置,即第3層最后一個(gè)。根據(jù)中序遍歷畫出圖示如圖所示。]6.C [循環(huán)5次,每次循環(huán)有3種可能,一是當(dāng)i為偶數(shù)時(shí),入隊(duì)一個(gè)[1,9] 之間的整數(shù),二是當(dāng)i為奇數(shù)時(shí),且q[tail-1]7. A [本題考查棧的入棧和出棧。把握出入棧的條件,當(dāng)棧為空(top==-1)時(shí)入棧;當(dāng)a[i]是偶數(shù)時(shí),把棧頂中比該數(shù)小的數(shù)出棧,自身入棧。21入棧,10入棧,18先讓10出棧,再入棧,18入棧,12入棧。]8.B [依次調(diào)用函數(shù)時(shí),k的值為4,3,2,1,0,因此對(duì)應(yīng)的字母c依次為edcba。chg(4)=chg(3)+″e(cuò)″;chg(3)=″d″+chg(2) ;chg(2)=chg(1)+″c″;chg(1)=″b″+chg(0) ;chg(0)=chg(-1)+″a″,依次進(jìn)行回歸,chg(1)=″ba″,chg(2)=″bac″,chg(3)=″dbac″,chg(4)=″dbace″。]9.C [若第1次產(chǎn)生的隨機(jī)數(shù)為1,則返回a[0]+f(2*0+1),即3+f(1)。若x的值為1,函數(shù)返回a[1]+f(2*1+randint(1,3)),產(chǎn)生隨機(jī)數(shù)分別為1,2,3時(shí),返回值依次為4+6=10,4+7=11,4+8=12,則3+f(1)的值依次為13,14,15。若第1次產(chǎn)生的隨機(jī)數(shù)為2,則返回a[0]+f(2*0+2),其值為3+5=8。若第1次產(chǎn)生的隨機(jī)數(shù)為3,則返回a[0]+f(2*0+3),其值為3+6=9。]10.D [a[7]和a[6]、a[6]和a[5]、a[5]和a[4]依次比較,實(shí)現(xiàn)a[4]到a[7]升序,j為4時(shí),并沒有和a[3]比較和交換,但a[3]和a[2]、a[2]和a[1]、a[1]和a[0]依次比較和交換,形成有序序列。]11.A [本題考查對(duì)分查找。列表 a 中的元素為1-15 中的奇數(shù),查找的 key 為 2-16 中的偶數(shù),所以查找的結(jié)果不存在 a[m]==key 也就是找到的情況,break 不會(huì)被執(zhí)行。查找的過程如下:s 的值可能為-2,-1,1,3,共4種。]12.D [本題考查鏈表的插入。先分別獲取奇數(shù)節(jié)點(diǎn)連接而成的鏈表和偶數(shù)節(jié)點(diǎn)連接而成的鏈表;再連接兩個(gè)鏈表得到新鏈表。]13.(1)3 (2)①suma+=i ②tail+=1 ③tail=head+1解析 本題考查隊(duì)列的基本操作。(1)以16包為一箱,因此箱號(hào)分別為1,2,2,2,3,3。共3箱。(2)①統(tǒng)計(jì)口罩?jǐn)?shù)量最多的包編號(hào)和累加各包口罩?jǐn)?shù)量。 每箱口罩的數(shù)量肯定在maxa與suma-1之間,變量i枚舉區(qū)間中每個(gè)數(shù),當(dāng)累積的數(shù)量t14.(1)DEF (2)①cur=st[top] ②f[st[j]] ③st[top]=i解析 本題考查棧的基本操作。(1)略。(2)棧st用于存儲(chǔ)每次出現(xiàn)新的節(jié)點(diǎn)數(shù),當(dāng)有新的節(jié)點(diǎn)出現(xiàn),不斷地進(jìn)棧,若找到終點(diǎn),則開始出棧,并對(duì)每次訪問起點(diǎn)的棧作好標(biāo)記。①中將獲取當(dāng)前節(jié)點(diǎn)cur的值為st[top]。②變量j從0開始,不斷地枚舉棧,找到標(biāo)志為真的節(jié)點(diǎn),構(gòu)成查找的路徑。③發(fā)現(xiàn)一個(gè)新的節(jié)點(diǎn),把新的節(jié)點(diǎn)入棧。15.(1)C (2)①dlist[head][1] ②0 ③dlist[pre][1]=dlist[cur][1]④left==1解析 (1) A組各輪次結(jié)果分別為TFF,B組為FF,C組為TFT,D組為FTF,因此獲勝的為C組。(2)①鏈表 dlist數(shù)據(jù)區(qū)域值為組的名稱,指針為下一下組的索引,已經(jīng)輸出頭節(jié)點(diǎn)的信息,因此當(dāng)前節(jié)點(diǎn)cur的初值為頭節(jié)點(diǎn)的下一節(jié)點(diǎn)。②每一輪按A→B→C→D→A順序輪流作答,將要構(gòu)建一個(gè)循環(huán)鏈表,尾節(jié)點(diǎn)將指向第1個(gè)節(jié)點(diǎn)。③在鏈表中刪除當(dāng)前節(jié)點(diǎn)cur,將前驅(qū)指向當(dāng)前節(jié)點(diǎn)的后繼。④最后剩下一組,該組獲勝。(共44張PPT)第六章 大數(shù)據(jù)時(shí)代數(shù)據(jù)的組織驗(yàn)收卷(五) 綜合練習(xí)(A)(考試時(shí)間40分鐘 滿分50分)一、選擇題(本題共12小題,每小題2分,共24分)C解析 本題考查不同數(shù)據(jù)結(jié)構(gòu)的特性和算法描述。A選項(xiàng)隊(duì)列和棧都是一種線性表,隊(duì)列的特性是先進(jìn)先出,棧的特性是先進(jìn)后出。B選項(xiàng)遞歸求 n!要遞推和回歸兩個(gè)階段(分解問題,逐級(jí)返回),迭代求 n!循環(huán)代碼中參與運(yùn)算的變量作為下一次循環(huán)計(jì)算的初始值。當(dāng) n 越大,迭代算法的效率明顯高于遞歸算法。C選項(xiàng)使用數(shù)組這種數(shù)組結(jié)構(gòu)在數(shù)組尾部進(jìn)行數(shù)據(jù)插入和刪除操作時(shí),不會(huì)引起數(shù)據(jù)移動(dòng);D選項(xiàng)鏈表的操作需要從頭指針開始,遍歷到需要操作的節(jié)點(diǎn),因?yàn)槟硢蜗蜴湵?節(jié)點(diǎn)數(shù)>2),所以在對(duì)該鏈表進(jìn)行刪除尾節(jié)點(diǎn)的操作時(shí)需要遍歷從頭指針開始到尾指針等多個(gè)節(jié)點(diǎn)。A.隊(duì)列和棧都是一種線性表,但兩者有不相同的特性B.采用相同公式求解n!,使用迭代算法比遞歸算法的算法效率高C.使用數(shù)組結(jié)構(gòu)在進(jìn)行數(shù)據(jù)插入和刪除操作時(shí),一定會(huì)引起數(shù)據(jù)移動(dòng)D.某單向鏈表(節(jié)點(diǎn)數(shù)>2)設(shè)有頭尾指針,在刪除該鏈表尾節(jié)點(diǎn)時(shí)需要遍歷多個(gè)節(jié)點(diǎn)D2.約定:T操作是指在隊(duì)列中1個(gè)元素出隊(duì)后再入隊(duì),E操作是指將1個(gè)元素入隊(duì),P操作是指隊(duì)列中1個(gè)元素出隊(duì),隊(duì)首指針head和隊(duì)尾指針tail初始值均為0。則經(jīng)過EETPETEP系列操作后,隊(duì)首指針head和隊(duì)尾指針tail的值分別為( )A.3 4 B.3 5 C.4 5 D.4 6解析 本題考查隊(duì)列的基本操作。T操作既有入隊(duì),又有出隊(duì),因此共有6次入隊(duì),4次出隊(duì),每次出隊(duì)和入隊(duì),指針分別加1。D解析 本題主要考查的是棧的入棧和出棧操作。已知當(dāng)前棧中的元素從棧底到棧頂依次為“d,e,f,g”,說明入棧順序?yàn)椤癲、e、f、g”,而元素f的進(jìn)棧順序則沒有要求,因?yàn)樵豥進(jìn)棧可直接出棧,因此,ABC選項(xiàng)都有可能,D選項(xiàng)不可能是入棧順序,因?yàn)樵豧應(yīng)在元素g之前入棧。D4.已知一棵完全二叉樹的節(jié)點(diǎn)總數(shù)為 12,則有關(guān)該二叉樹的說法正確的是( )A.樹的度為12 B.樹的層數(shù)為3C.葉子節(jié)點(diǎn)數(shù)為5 D.最后一層有5個(gè)節(jié)點(diǎn)解析 本題考查二叉樹的基本性質(zhì)。符合完全二叉樹的兩個(gè)條件為:①只有最下二層中的節(jié)點(diǎn)度數(shù)小于2;②最下一層的葉子節(jié)點(diǎn)都依次排列在該層最左邊位置。A選項(xiàng)度指樹的最大節(jié)點(diǎn)數(shù)。B選項(xiàng)若為滿二叉樹,第3層及前面所有節(jié)點(diǎn)數(shù)和為7,因此至少4層。C選項(xiàng)最后一層上有5個(gè)節(jié)點(diǎn),即有葉子節(jié)點(diǎn)數(shù)為5,但第3層上還有一個(gè)葉子節(jié)點(diǎn)。D5.某二叉樹的樹形結(jié)構(gòu)如圖所示,其中序遍歷結(jié)果為FDGBAEC。若補(bǔ)全為完全二叉樹后,按從上到下、自左往右的順序用一維數(shù)組a存儲(chǔ),其中根節(jié)點(diǎn)存儲(chǔ)于元素a[0]中,則元素a[6]的值為( )解析 元素a[6]位于二叉樹從上至下,從左到右第7個(gè)位置,即第3層最后一個(gè)。根據(jù)中序遍歷畫出圖示如圖所示。A.D B.F C.G D.C6.有如下Python 程序段:import randomq=[0]*5head,tail=0,0for i in range(5): if random.randint(0,i)%2==0: q[tail]=random.randint(1,9) #隨機(jī)生成1到9之間的整數(shù) elif head q[tail]=q[head] head+=1 tail+=1print(q)解析 循環(huán)5次,每次循環(huán)有3種可能,一是當(dāng)i為偶數(shù)時(shí),入隊(duì)一個(gè)[1,9] 之間的整數(shù),二是當(dāng)i為奇數(shù)時(shí),且q[tail-1]C7.有如下 Python程序段:a=[21,5,10,9,18,10,5,18,12,11]n=len(a)st=[0]*n; top=-1for i in range(n): if top==-1: top+=1 st[top]=a[i] else: if a[i]%2==0: while top>-1 and a[i]>st[top]: top-=1A解析 本題考查棧的入棧和出棧。把握出入棧的條件,當(dāng)棧為空(top==-1)時(shí)入棧;當(dāng)a[i]是偶數(shù)時(shí),把棧頂中比該數(shù)小的數(shù)出棧,自身入棧。21入棧,10入棧,18先讓10出棧,再入棧,18入棧,12入棧。 top+=1 st[top]=a[i]while top>-1: print(st[top],end=″ ″) top-=1執(zhí)行該程序段后,輸出結(jié)果為( )A.12 18 18 21 B.18 18 12C.21 18 18 12 D.11 12 18 18 21B8.定義如下函數(shù):def chg(k): if k==-1: return ″″ else: c=chr(ord(″a″)+k) if k%2==1: return c+chg(k-1) else: return chg(k-1)+c執(zhí)行語句m=chg(4)后,m的值為( )A.″e(cuò)cabd″ B.″dbace″ C.″abcde″ D.″e(cuò)dcba″解析 依次調(diào)用函數(shù)時(shí),k的值為4,3,2,1,0,因此對(duì)應(yīng)的字母c依次為edcba。chg(4)=chg(3)+″e(cuò)″;chg(3)=″d″+chg(2) ;chg(2)=chg(1)+″c″;chg(1)=″b″+chg(0) ;chg(0)=chg(-1)+″a″,依次進(jìn)行回歸,chg(1)=″ba″,chg(2)=″bac″,chg(3)=″dbac″,chg(4)=″dbace″。Cfrom random import randinta=[3,4,5,6,7,8]def f(x): if x<2: return a[x]+f(2*x+randint(1,3)) else: return a[x]A.8 B.9 C.10 D.13解析 若第1次產(chǎn)生的隨機(jī)數(shù)為1,則返回a[0]+f(2*0+1),即3+f(1)。若x的值為1,函數(shù)返回a[1]+f(2*1+randint(1,3)),產(chǎn)生隨機(jī)數(shù)分別為1,2,3時(shí),返回值依次為4+6=10,4+7=11,4+8=12,則3+f(1)的值依次為13,14,15。若第1次產(chǎn)生的隨機(jī)數(shù)為2,則返回a[0]+f(2*0+2),其值為3+5=8。若第1次產(chǎn)生的隨機(jī)數(shù)為3,則返回a[0]+f(2*0+3),其值為3+6=9。D10.列表a中存儲(chǔ)了8個(gè)元素,即a[0],a[1],…,a[7],有如下Python程序段:n=8for i in range(n-1): for j in range(n-1,i,-1): if a[j] a[j-1],a[j]=a[j],a[j-1]該程序段實(shí)現(xiàn)的是( )A.a[0]到a[7]升序排序B.a[4]到a[7]升序排序C.a[0]到a[7]的數(shù)據(jù)對(duì)4取余之后升序排序D.a[0]到a[3]、a[4]到a[7]分別升序排序解析 a[7]和a[6]、a[6]和a[5]、a[5]和a[4]依次比較,實(shí)現(xiàn)a[4]到a[7]升序,j為4時(shí),并沒有和a[3]比較和交換,但a[3]和a[2]、a[2]和a[1]、a[1]和a[0]依次比較和交換,形成有序序列。11.如下 Python 程序段:import randoma=[1,3,5,7,9,11,13,15]key=random.randint(1,8)*2i,j=0,len(a)-1s=0while i<=j(luò): m=(i+j+1)∥2 if a[m]==key: break if a[m]>key: j=m-1;s-=1 else: i=m+1;s+=1print(s)上述程序執(zhí)行完以后,s 的值可能有( )A.4 種 B.5種 C.7種 D.8 種A解析 本題考查對(duì)分查找。列表 a 中的元素為1-15 中的奇數(shù),查找的 key 為 2-16 中的偶數(shù),所以查找的結(jié)果不存在 a[m]==key 也就是找到的情況,break 不會(huì)被執(zhí)行。查找的過程如下:s 的值可能為-2,-1,1,3,共4種。12.將鏈表中的奇數(shù)節(jié)點(diǎn)和偶數(shù)節(jié)點(diǎn)分別排在一起,奇數(shù)節(jié)點(diǎn)和偶數(shù)節(jié)點(diǎn)的相對(duì)順序不變。如原始鏈表為 ,新鏈表為 。部分程序如下:#讀入鏈表,存儲(chǔ)在列表a中,head存儲(chǔ)鏈表的頭節(jié)點(diǎn)odd=headeven=a[odd][1]tmp=evenwhile a[odd][1]!=-1 and a[even][1]!=-1: 解析 本題考查鏈表的插入。先分別獲取奇數(shù)節(jié)點(diǎn)連接而成的鏈表和偶數(shù)節(jié)點(diǎn)連接而成的鏈表;再連接兩個(gè)鏈表得到新鏈表。a[odd][1]=tmp上述程序段中方框處可選的語句為①odd=a[odd][1]②even=a[even][1]③a[odd][1]=a[even][1]④a[even][1]=a[odd][1]則方框處語句依次為( )A.①③②④ B.①②③④ C.③②④① D.③①④②D二、非選擇題(本題共3小題,共26分)13.(6分)疫情防控期間,某工廠為了將流水線上已生產(chǎn)的口罩及時(shí)裝箱,并盡量分配給更多的疫情地區(qū),需要設(shè)計(jì)一個(gè)程序?qū)崿F(xiàn)自動(dòng)化裝箱。裝箱要求為:流水線上生產(chǎn)的每包口罩?jǐn)?shù)量有可能不同,裝入箱子的口罩必須為流水線上連續(xù)的若干包,每箱內(nèi)的口罩?jǐn)?shù)量必須相同,在已知每包口罩?jǐn)?shù)量和口罩總包數(shù)的前提下,裝盡可能多的箱子。例l:某流水線上有8包口罩,每包口罩的數(shù)量如下表:包序號(hào) 1 2 3 4 5 6 7 8 每箱數(shù)量每包數(shù)量 12 3 9 6 6 9 3 12箱號(hào) (方案1) 1 2 2 3 3 4 4 5 12箱號(hào) (方案2) 1 1 2 2 3 3 4 4 15箱號(hào) (方案3) 1 1 1 1 2 2 2 2 30在上述情況下,有3種分箱方案,方案1為最優(yōu)方案。例2:某流水線上有8包口罩,每包口罩的數(shù)量如下表:序號(hào) 1 2 3 4 5 6 7 8數(shù)量 1 3 5 7 9 11 13 15在上述情況下,沒有符合要求的裝箱方案。按照上述要求,編寫一個(gè)Python程序,功能如下:讀取流水線上每包口罩的數(shù)量,輸出分箱結(jié)果,若存在裝箱方案,則輸出最多的裝箱數(shù),否則輸出“無方案”。程序界面如圖所示。(1)假如流水線上生產(chǎn)的每包口罩?jǐn)?shù)量依次為“16,5,3,8,7,9”,按照上述裝箱要求,則裝箱結(jié)果為________________。包編號(hào):1 2 3 4 5 6 7 8包數(shù)量:12 3 9 6 6 9 3 12方案1每箱12包,箱號(hào):1—1,2—3,4—5,6—7,8—8方案2每箱15包,箱號(hào):1—2,3—4,5—6,7—8方案3每箱30包,箱號(hào):1—4,5—8總共方案數(shù)為3,第一種方案最佳。(2)代碼如下,請(qǐng)?jiān)诔绦騽澗€處填入合適的代碼。def F(x): #數(shù)字按固定長度輸出 return (″ ″+str(x))[-5:]def Sa(a,h,t): #將數(shù)組索引號(hào)h至t-1之間的數(shù)值相加。 s=0 for i in range(h,t): s+=a[i] return s#讀取各包中口罩?jǐn)?shù)量到數(shù)組a,并輸出,代碼略maxa=0;suma=0for i in a: #統(tǒng)計(jì)口罩?jǐn)?shù)量最多的包編號(hào)和累加各包口罩?jǐn)?shù)量。 if i>maxa: maxa=iif i>maxa: maxa=i ①____________m=0for i in range(maxa,suma): xh=[] head=0;tail=1 while tail<=n: f=False t=Sa(a,head,tail)if t ②____________ elif t==i: xh.append(tail-1) f=True head=tail ③____________ else: break if f: m+=1 s=″方案″+str(m)+″每箱″+str(i)+″包,箱號(hào):1-″ for j in xh: s=s+str(j+1)+″,″+str(j+2)+″-″ print(s[:-3])解析 本題考查隊(duì)列的基本操作。(1)以16包為一箱,因此箱號(hào)分別為1,2,2,2,3,3。共3箱。(2)①統(tǒng)計(jì)口罩?jǐn)?shù)量最多的包編號(hào)和累加各包口罩?jǐn)?shù)量。 每箱口罩的數(shù)量肯定在maxa與suma-1之間,變量i枚舉區(qū)間中每個(gè)數(shù),當(dāng)累積的數(shù)量t答案 (1)3 (2)①suma+=i ②tail+=1 ③tail=head+114.(10分)某彈珠游戲,彈珠從起點(diǎn)到終點(diǎn)需要經(jīng)過若干節(jié)點(diǎn)(不存在繞圈現(xiàn)象,且保證可以到達(dá)),但方案可能不唯一。各節(jié)點(diǎn)關(guān)系如圖a所示,尋找線路的方法:第1輪節(jié)點(diǎn)A進(jìn)棧,作為當(dāng)前節(jié)點(diǎn),同時(shí)對(duì)A作起點(diǎn)標(biāo)志為真操作,發(fā)現(xiàn)有B、D可以連通,B和D分別進(jìn)棧,棧頂為D;第2輪以D為當(dāng)前節(jié)點(diǎn),對(duì)D作起點(diǎn)標(biāo)志為真操作,從該節(jié)點(diǎn)出發(fā),枚舉所有的路線,直到到達(dá)終點(diǎn)。找到終點(diǎn)后,枚舉棧中節(jié)點(diǎn),查找起點(diǎn)標(biāo)志為真的節(jié)點(diǎn),輸出可以從起點(diǎn)到終點(diǎn)達(dá)到的線路;接著對(duì)當(dāng)前節(jié)點(diǎn)作出棧處理,往前查找一個(gè)出棧標(biāo)志為假的節(jié)點(diǎn),繼續(xù)重復(fù)查找,直到棧中元素為空。用數(shù)組存儲(chǔ)各節(jié)點(diǎn)信息,節(jié)點(diǎn)A、B、C、D、E、F、G、H分別編號(hào)為0~7。數(shù)值1表示表格中左側(cè)節(jié)點(diǎn)可達(dá)上方節(jié)點(diǎn),數(shù)值0表示無法抵達(dá)。程序運(yùn)行的結(jié)果如圖所示,請(qǐng)?jiān)趧澗€處填入合適的代碼。路徑1:A,D,G,H路徑2:A,D,E,F(xiàn),H路徑3:A,D,E,C,F(xiàn),H路徑4:A,B,C,F(xiàn),H(1)起點(diǎn)為D,終點(diǎn)為F,經(jīng)過節(jié)點(diǎn)數(shù)最少的線路圖為________。(2)實(shí)現(xiàn)上述功能的部分Python程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。n=8#n為總的節(jié)點(diǎn)數(shù),讀取n*n個(gè)節(jié)點(diǎn)之間的信息,存儲(chǔ)在二維數(shù)組 a中,若a[i][j]值為1,表示i節(jié)點(diǎn)到j(luò)節(jié)點(diǎn)可達(dá)。代碼略。st=[0]*nst[0]=0;top=0 #構(gòu)建一個(gè)n個(gè)元素的棧f=[False]*n #是否以該節(jié)點(diǎn)為起點(diǎn)向后查找過tot=0 #記錄可行路徑的數(shù)量while top!=-1:①________f[cur]=True for i in range(n): if a[cur][i]==1 : if i==n-1: tot+=1 s=″″;j=0 while j<=top: if ②________: s=s+str(chr(st[j]+65))+″,″ j+=1 print(″路徑″+str(tot)+″:″+s+chr(64+n)) top-=1 while top>=0 and f[st[top]]: top-=1 else: top+=1 ③________解析 本題考查棧的基本操作。(1)略。(2)棧st用于存儲(chǔ)每次出現(xiàn)新的節(jié)點(diǎn)數(shù),當(dāng)有新的節(jié)點(diǎn)出現(xiàn),不斷地進(jìn)棧,若找到終點(diǎn),則開始出棧,并對(duì)每次訪問起點(diǎn)的棧作好標(biāo)記。①中將獲取當(dāng)前節(jié)點(diǎn)cur的值為st[top]。②變量j從0開始,不斷地枚舉棧,找到標(biāo)志為真的節(jié)點(diǎn),構(gòu)成查找的路徑。③發(fā)現(xiàn)一個(gè)新的節(jié)點(diǎn),把新的節(jié)點(diǎn)入棧。答案 (1)DEF (2)①cur=st[top] ②f[st[j]] ③st[top]=i15.(10分)王老師組織同學(xué)參加答題游戲,由“A”,“B”,“C”,“D”4個(gè)小組參與游戲,每個(gè)小組由k名學(xué)生組成,由1人代表小組答題。抽簽確定開始的小組,每一輪按A→B→C→D→A順序輪流作答,每答對(duì)一題加10分,每個(gè)選手答錯(cuò)一題即遭淘汰,由同組下一個(gè)選手補(bǔ)上,若該組所有選手都已淘汰則該組即遭淘汰,其他小組繼續(xù)輪流作答,直到剩下最后一組,即為獲勝小組,若最后一輪沒有小組幸存,則分?jǐn)?shù)最高的小組獲勝。(1)若每組有兩個(gè)選手,從A組開始,經(jīng)過3輪答題,答題結(jié)果為“TFTF”,“FFFT”,“FTF”(答對(duì)用T表示,答錯(cuò)用F表示),則獲勝的小組是______。(2)王老師用鏈表數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)了答題游戲的算法,并用 Python 編寫程序模擬,實(shí)現(xiàn)了輸入每組人數(shù),隨機(jī)產(chǎn)生開始的小組,輸入每輪答題的情況,輸出最后獲勝的隊(duì)伍。該程序的 Python 代碼如下,請(qǐng)?jiān)趧澗€處填入合適的代碼,完善程序。def findmax(score): #findmax 函數(shù)功能是在 4 個(gè)小組查找分?jǐn)?shù)最高的小組并輸出,代碼略def printlist(head): #輸出當(dāng)前剩余小組的得分情況 print(dlist[head][0],″組得分是″,score[dlist[head][0]]) cur=①________ while cur!=head:print(dlist[cur][0],″組得分是″,score[dlist[cur][0]])cur=dlist[cur][1]k=int(input(″輸入每個(gè)組的人數(shù):″))code=″ABCD″dlist=[[code[i],i+1] for i in range(4) ] #初始化鏈表 dlistdlist[3][1]=②________head=randint(0,3) #隨機(jī)產(chǎn)生開始的小組print(″從″,code[head],″開始答題″)number={} #存儲(chǔ)每組剩余替補(bǔ)人數(shù)score={} #存儲(chǔ)每組得分?jǐn)?shù)據(jù)for i in dlist: number[i[0]]=k-1 score[i[0]]=0cur=headpre=(head-1)%4left=4while left>1: ans=input(″輸入本輪答題情況″) for j in ans: if j==″T″: score[dlist[cur][0]]+=10 pre=dlist[pre][1] cur=dlist[cur][1] else: if number[dlist[cur][0]]!=0:#該組還有替補(bǔ)選手,則繼續(xù)參賽 cur=dlist[cur][1] left-=1 if left!=0:print(″剩余小組得分情況″)printlist(head)if __④________: print(″最終獲勝的組是:″,dlist[head][0])else: findmax(score)答案 (1)C (2)①dlist[head][1] ②0③dlist[pre][1]=dlist[cur][1] ④left==1解析 (1) A組各輪次結(jié)果分別為TFF,B組為FF,C組為TFT,D組為FTF,因此獲勝的為C組。(2)①鏈表 dlist數(shù)據(jù)區(qū)域值為組的名稱,指針為下一下組的索引,已經(jīng)輸出頭節(jié)點(diǎn)的信息,因此當(dāng)前節(jié)點(diǎn)cur的初值為頭節(jié)點(diǎn)的下一節(jié)點(diǎn)。②每一輪按A→B→C→D→A順序輪流作答,將要構(gòu)建一個(gè)循環(huán)鏈表,尾節(jié)點(diǎn)將指向第1個(gè)節(jié)點(diǎn)。③在鏈表中刪除當(dāng)前節(jié)點(diǎn)cur,將前驅(qū)指向當(dāng)前節(jié)點(diǎn)的后繼。④最后剩下一組,該組獲勝。 展開更多...... 收起↑ 資源列表 驗(yàn)收卷(五) 綜合練習(xí)(A).docx 驗(yàn)收卷(五) 綜合練習(xí)(A).pptx 縮略圖、資源來源于二一教育資源庫