![數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)3_第1頁](http://file4.renrendoc.com/view14/M06/3D/35/wKhkGWZY-kCAEdktAAIvC5iB4TM762.jpg)
![數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)3_第2頁](http://file4.renrendoc.com/view14/M06/3D/35/wKhkGWZY-kCAEdktAAIvC5iB4TM7622.jpg)
![數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)3_第3頁](http://file4.renrendoc.com/view14/M06/3D/35/wKhkGWZY-kCAEdktAAIvC5iB4TM7623.jpg)
![數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)3_第4頁](http://file4.renrendoc.com/view14/M06/3D/35/wKhkGWZY-kCAEdktAAIvC5iB4TM7624.jpg)
![數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)3_第5頁](http://file4.renrendoc.com/view14/M06/3D/35/wKhkGWZY-kCAEdktAAIvC5iB4TM7625.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)(三)
【知識(shí)要點(diǎn)】
一、“數(shù)據(jù)合并”問題簡(jiǎn)化成合并兩個(gè)有序數(shù)據(jù)序列的問題,對(duì)如何使用數(shù)組解決數(shù)據(jù)合并問題進(jìn)行了分析
并設(shè)計(jì)了算法。下面將對(duì)算法進(jìn)行修改和優(yōu)化,避免插入數(shù)據(jù)時(shí)其他數(shù)據(jù)元素的移動(dòng),并編程實(shí)現(xiàn)該功能。
算法設(shè)計(jì):
①初始化3個(gè)數(shù)組a,b,c,元素個(gè)數(shù)分別為m,n和n+m。數(shù)組a和數(shù)組b用來存儲(chǔ)已有的兩個(gè)有
序數(shù)據(jù)(降序),數(shù)據(jù)使用隨機(jī)函數(shù)randint(start,end)產(chǎn)生;數(shù)組c用于保存合并后的所有數(shù)據(jù)(降序),
所有數(shù)組元素的值初始化為0。②使用變量i指向數(shù)組a當(dāng)前未處理數(shù)據(jù)中要處理的數(shù)據(jù)元素的位置,初始
化為0;變量j指向數(shù)組b當(dāng)前未處理數(shù)據(jù)中要處理的數(shù)據(jù)元素的位置,初始化為0;變量k指向數(shù)組c中
可加入元素的位置,初始化為0。③重復(fù)以下操作,直至數(shù)組a或數(shù)組b中的數(shù)據(jù)元素全部合并入數(shù)組c
中:比較a[i]和b[j]的大小,若a[i]2b[j],則將a[i]放入數(shù)組c中,并將i和k的值增加1;否則,將
b[j]放入數(shù)組c中,并將j和k的值增加1。④如果數(shù)組a或數(shù)組b中尚有未處理的數(shù)據(jù)元素,那么將剩余
數(shù)據(jù)元素按原有順序依次存入數(shù)組c中,合并完成,輸出數(shù)組c。
fromrandomimportrandint
a=[0]*20;b=[0]*15;c=[0]*35#創(chuàng)建數(shù)組
a[0]=randint(95,100)
foriinranged,20):#隨機(jī)產(chǎn)生降序數(shù)據(jù)序列一
a[i]=a[il]randint(1,5)
b[0]=randint(95,100)
foriinranged,15):#隨機(jī)產(chǎn)生降序數(shù)據(jù)序列二
b[i]=b[il]randint(1,5)
print(,z原始數(shù)據(jù)序列一為:〃,a)
printCz原始數(shù)據(jù)序列二為:〃,b)
方法一:通過雙指針逐個(gè)遍歷二數(shù)組元素,將較大的存入合并數(shù)組中
i=0;j=0;k=0
while(i<20andj>15):#合并數(shù)據(jù)直至某個(gè)數(shù)組數(shù)據(jù)合并完成
ifa[i]>=b[j]:
c[k]=a[i];i=i+l;k=k+l
else:
c[k]=b[j];j=j+l;k=k+l
whilei<20:#當(dāng)數(shù)據(jù)序列一中還有數(shù)據(jù)時(shí)的處理
c[k]=a[i];i=i+l;k=k+l
whilej<15:#當(dāng)數(shù)據(jù)序列二中還有數(shù)據(jù)時(shí)的處理
c[k]=b[j];j=j+l;k=k+l
print(〃合并后的數(shù)據(jù)序列為:〃,c)
方法二:將b數(shù)組元素依次插入a數(shù)組中
forminrange(len(b)):
a.append(b[m])
tmp=a[l]
n=len(a)2
whiletmp>a[n]andn>0:
a[n+l]=a[n]
n=nl
a[n]=tmp
print(a)
⑵將兩個(gè)有序鏈表中的數(shù)據(jù)合并到一個(gè)鏈表中。
fromrandomimportrandint
data_[];head_a=l
data_b=[];head_b=l
tmp=randint(95,100)
data_a.append([tmp,head_a])
head_a=0
foriinrange(1,20):
tmp=data_a[il][0]randint(1,5)
data_a.append([tmp,data_a[il][1]])
data_a[il][l]=i
print(〃鏈表結(jié)構(gòu)的原始數(shù)據(jù)序列一〃)
print(data_a)
tmp=randint(95,100)
datab.append([tmp,head_b])
head_b=0
foriinrange(1,25):
tmp=data_b[il][0]randint(1,5)
data_b.append([tmp,data_b[il][1]])
data_b[il][l]=i
print(〃鏈表結(jié)構(gòu)的原始數(shù)據(jù)序列二〃)
print(data_b)
k_a=heada;q_a=head_a;k_b=head_b
while(k_a!=1andk_b!=1):
ifdata_a[k_a][0]>=data_b[k_b][0]:
Q_a=k_a
k_a=data_a[k_a][1]
else:
ifk_a=head_a:#在鏈表data_a的頭部插入節(jié)點(diǎn)
data_a.append([data_b[k_b][0],head_a])
head_a=len(data_a)1
q_a二head_a
k_b=data_b[k_b][1]
else:#在鏈表data_a的非頭部插入節(jié)點(diǎn)
data_a.append([data_b[k_b][0],k_a])
data_a[q_a][1]=len(data_a)1
q_a=data_a[q_a][1]
kb=data_b[k_b][1]
whilekb!=1:
data_a.append([data_b[k_b][0]1])
data_a[q_a][1]=len(data_a)1
q_a=data_a[q_a][1]
kb=data_b[k_b][1]
print(〃鏈表結(jié)構(gòu)的合并后數(shù)據(jù)序列〃)
print(data_a)
print(〃按鏈表鏈接順序輸出數(shù)據(jù)序列〃)
tmp=heada
whiledata_a[tmp][1]!=1:
print(data_a[tmp][0],end=〃〃)
tmp二data_a[tmp][1]
print(data_a[tmp][0])
(3)算法總結(jié)(請(qǐng)根據(jù)代碼,講變量名填入空格)
①初始化兩個(gè)空鏈表和,并使用和作為兩個(gè)鏈表的頭指針,其中
()作為存儲(chǔ)結(jié)果的鏈表。
②模擬生成兩個(gè)降序序列數(shù)據(jù),每個(gè)序列中第一個(gè)數(shù)據(jù)使用隨機(jī)函數(shù)產(chǎn)生,其他數(shù)據(jù)則由前
一個(gè)數(shù)據(jù)減去一個(gè)隨機(jī)值(「5)產(chǎn)生,產(chǎn)生的數(shù)據(jù)作為新節(jié)點(diǎn)的數(shù)據(jù)區(qū)域的值,生成新的節(jié)點(diǎn)在尾部插入。
③使用變量______與指向兩個(gè)鏈表中未合并的數(shù)據(jù)序列中最前面(值最大)的節(jié)點(diǎn),初始
化,,由于在鏈表data_a中需要進(jìn)行插入節(jié)點(diǎn)的操作,必須記錄插入位置的前驅(qū)
節(jié)點(diǎn),使用變量_______,初始化q_a二head。重復(fù)以下操作,直到或指向空(即某個(gè)鏈表
元素全部處理完):比較data_a[k_a][0]和data_b[k_b][0]的大小。若,則
修改q_a與k_a相等,再將k_a指向下一個(gè)節(jié)點(diǎn);否則將鏈表data_b中指向的節(jié)點(diǎn)插入到鏈表
data_a中,作為q_a指向節(jié)點(diǎn)的后繼節(jié)點(diǎn),再將k_b指向鏈表中的下一個(gè)節(jié)點(diǎn)。
④若k_b未指向空,則將鏈表data_b剩余節(jié)點(diǎn)按順序插入鏈表的尾部。
⑤輸出鏈表data_a中每個(gè)節(jié)點(diǎn)的數(shù)據(jù)區(qū)域的值。
【例題剖析】
3.合并兩個(gè)有序鏈表。將兩個(gè)由升序序列數(shù)據(jù)組成的鏈表進(jìn)行合并,要求新鏈表中的數(shù)據(jù)仍為升序序列。
程序運(yùn)行的界面如下圖所示:
實(shí)現(xiàn)上述功能的Python程序如下:
classNode:
def_init_(self,data=0,next=None):
self.data=data
self.next=next
classSolution:
defmergeLists(self,hl:Node,h2:Node):
head=Node()
node=head
whilehlandh2:
數(shù)據(jù)序列a為:
if①:
3681018
node.next=hl
數(shù)據(jù)序列b為:
hl=hl.next
27915
else:
合并后的數(shù)據(jù)序列為:
node.next=h2
236789101518
h2=h2.next
②
ifhl:
node.next=hl
else:
node.next=h2
node=head
returnhead,next
#生成鏈表a并輸出鏈表中數(shù)據(jù),代碼略
#生成鏈表b并輸出鏈表中數(shù)據(jù),代碼略
x=Solution()
xhead=x.mergeLists(ptrl,ptr2)
print(〃合并后的數(shù)據(jù)序列為:〃)
whilexhead:
print(xhead.data,end=〃〃)
?
請(qǐng)?jiān)趧澗€處填入合適的代碼:
答案:①hl.data<h2.data?node=node,next?xhead=xhead.next
解析:本題主要考查的是鏈表的綜合應(yīng)用。根據(jù)if下面的語句可知,if條件為指針hl指向的節(jié)點(diǎn)的值小
于指針h2指向的節(jié)點(diǎn)的值,因此①處代碼為hl.data<h2.data。將a、b鏈表中的較小值的節(jié)點(diǎn)處理后,還
應(yīng)將node指針移至剛插入到鏈表中的新節(jié)點(diǎn),因此,劃線②處的代碼為node=node.next;劃線③處while
循環(huán)的功能是輸出合并后的鏈表,xhead為鏈表的頭指針,輸出當(dāng)前節(jié)點(diǎn)的data值后,將指針移動(dòng)到下一
個(gè)節(jié)點(diǎn),因此③處應(yīng)填入的代碼為xhead=xhead.nexto
【習(xí)題鞏固】
1.有如下Python程序段:
a=[2,2,6,3,1,5,6,2]
pos=0
foriinrange(1,len(a)):
ifa[i]>a[pos]:
pos=i
則程序執(zhí)行后,pos的值為()
A.0B.2C.3D.6
2.有如下Python程序段:
a=[1,2,3,4,5,5]
x,j=4,len(a)2
whilej>=0anda[j]>x:
a[j+l]=a[j]
j二l
a[j+l]=x
則程序執(zhí)行后,a[4]的值為()
A.2B.3C.4D.5
3.有如下Python程序段:
fromrandomimportrandom
i=0
a=[0]*6
whilei<=5:
a[i]=(int(random()*6+5))*(i%2+l)
forjinrange(i):
ifa[j]==a[i]:
i=il
break
i=i+1
程序執(zhí)行后,數(shù)組a各元素的數(shù)據(jù)可能是
A.[6,12,5,18,8,10]B.[7,18,10,10,6,12]
C.[8,15,6,16,7,12]D.[5,16,12,18,9,10]
4.有如下程序段:
importrandom
a=[0]*6
foriinrange(6):
a[i]=random,randint(1,5)*2+1
i=0
whilei<5:
ifa[i]>a[i+l]:
a[i],a[i+l]=a[i+l],a[i]
a[i]+=l
i+=l
print(a)
以上程序運(yùn)行后,列表a的值可能是:()
A.[2,5,10,10,10,9]B.[3,8,7,13,3,9]C.[8,12,3,5,3,11]D.[6,10,9,7,10,8]
5.有如下Python程序段
defbianli(head):
pt=head
whilept!=1:
print(data[pt][0],data[pt][1],〃>〃,end='')
pt二data[pt][1]
print()
data=[「A',1],[,B',2],['C',3],['D',1]]
head=0
bianli(head)#遍歷鏈表,顯示初始狀態(tài)為“A1>B2>C3>D1>”
qt=head
pt=data[qt][1]
bianli(head)#遍歷鏈表,顯示最終狀態(tài)為“A2>C1>B3>D1>”
執(zhí)行該程序段后,鏈表遍歷結(jié)果由初始狀態(tài)變?yōu)樽罱K狀態(tài),上述程序段中方框處可選代碼為:
①data[data[qt][1]][1]=pt②data[qt][1]=data[pt][1]③data[pt][1]=
data[data[pt][1]][1]
則方框處代碼的正確順序是
A.①②③B.①③②C.②①③D.②③①
6.小華規(guī)劃自駕旅游路線,出發(fā)地為杭州,目的地為北京,規(guī)劃過程中經(jīng)過了多次更改。
第一次依次加入的途徑地為上海、蘇州、南京、濟(jì)南、石家莊;
第二次在南京和濟(jì)南之間加入了途徑地青島,取消了途徑地南京;
第三次則在石家莊和北京之間加入了途徑地天津。
請(qǐng)使用鏈表編程實(shí)現(xiàn)其更改過程,并輸出三次更改路線后的結(jié)果。
完善代碼如下:
a=["杭州","上海","蘇州南京濟(jì)南","石家莊","北京","青島","天津"]
head=O
b=[l,1,1,1,1,1,1,1,1]
foriinrange(6):#第一次規(guī)劃
m
k=head#第二次規(guī)劃
whilek!=l:
ifa[k]二二〃南京〃:
break
(2)
(3)
b[k]=7
k=head
whilek!=l:
ifa[k]=〃南京〃:
break
q=k
k=b[k]
(4)
k=head#第三次規(guī)劃
whilek!=l:
ifa[k]=〃石家莊〃:
break
k=b[k]
b[8]=b[k]
b[k]=8
k=head
while(k!=l):
print(a[k],end=,/〃)
(5)
7.某投資者小趙將一段時(shí)間內(nèi)的證券操作記錄保存在文件“record,csv”中,部分界面如第4題圖a所
zj\O
使用pandas模塊對(duì)證券操作記錄進(jìn)行數(shù)據(jù)處理。
學(xué)習(xí)鏈表數(shù)據(jù)結(jié)構(gòu)后,小趙同學(xué)想篩選出證券操作盈利的記錄,并將結(jié)果以鏈表形式存儲(chǔ)。
(1)代碼實(shí)現(xiàn)如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。
importcsv
csvFile=open(z,record.csv〃,〃r〃,encoding=〃UTF8〃)
reader=csv.reader(csvFile)
a=[]#數(shù)據(jù)區(qū)域
foriteminreader:
a.append(item)
csvFile.close
points=[l]*len(a)#指針區(qū)域,與數(shù)據(jù)區(qū)域a中的數(shù)據(jù)---對(duì)應(yīng)
head二①
P=1
foriinrange(1,len(a)):
iffloat(a[i][5])>0:
ifhead=l:
P=i
else:
P=i
print(〃顯示證券操作盈虧為正的記錄:〃)
print(a[0])#顯示標(biāo)題
p=head
whilep!=l:
print(a[p])
_______④________
8.小明來到探險(xiǎn)島尋寶,島上共有N個(gè)寶藏(標(biāo)號(hào)為0至NDo每個(gè)寶藏有一條路連接下一個(gè)寶藏,寶
藏號(hào)和下一個(gè)寶藏號(hào)使用鏈表存儲(chǔ)。小明想知道,從其中一個(gè)寶藏出發(fā),最多可以找到多少個(gè)寶藏。
例如,共有5個(gè)寶藏,輸入“1,3,4,4,1,”表示0~4各寶藏點(diǎn)連接的下一個(gè)寶藏依次是:
L3,4,4,1(如下表)。則最多可以找到4個(gè)寶藏,路徑為:0號(hào)1號(hào)3號(hào)4號(hào)。
程序代碼如下:
(1)若有4個(gè)寶藏,且每個(gè)寶藏的連接情況為:2,0,0,1,那么小明最多可以挖到的寶藏?cái)?shù)是o
(2)請(qǐng)將代碼補(bǔ)充完整。
s二input(〃請(qǐng)輸入寶藏連接的情況:〃)
t=0;c=,z/z;a=[]
寶藏號(hào)01234
下一個(gè)寶藏號(hào)13441
else:
a.append([t,int(c)])
〃〃
c二
①
max=0
forheadinrange(0,t):#枚舉尋找寶藏起點(diǎn)
g=[]
p=head
whilepnoting:
g.append(p)
②
iflen(g)>max:
print(max)
9.雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)節(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接前驅(qū)和直接后
繼。在Python中可以使用二維列表來模擬雙向鏈表,用包含3個(gè)元素的列表來表示每一個(gè)節(jié)點(diǎn),其中第
一個(gè)元素存儲(chǔ)數(shù)據(jù),后兩個(gè)元素分別存儲(chǔ)指向前驅(qū)和后繼的指針。若沒有前驅(qū)或后繼節(jié)點(diǎn),則對(duì)應(yīng)的指針
值為lo下列程序生成了一些隨機(jī)正整數(shù),并依次存儲(chǔ)到一個(gè)雙向鏈表a中?,F(xiàn)在要求刪除其中值為偶數(shù)
的節(jié)點(diǎn),請(qǐng)?jiān)趧澗€處填入合適的代碼。
importrandom
a=□
head=1
foriinrange(8):
node二[random,randint(1,9),1,head]
a.append(node)
ifhead!=1:#非空鏈表
a[head][1]=len(a)1
head二①
p-head
whilep!=1:
ifa[p][0]%2==0:
ifa[p][1]!=1:#有前驅(qū)節(jié)點(diǎn)
a[a[p][l]][2]=②
ifa[p][2]!=1:#有后繼節(jié)點(diǎn)
a[a[p][2]][1]=a[p][1]
ifhead=p:#刪除頭節(jié)點(diǎn)
head=(3)
p=a[p][2]
10.王老師在處理最近一次的技術(shù)考試成績(jī),在這次考試中,每位同學(xué)的信息通用成績(jī)是通過機(jī)器分開掃描
并存放在csv文件中,如圖a所示為csv文件的部分截圖。由于機(jī)器老化,在識(shí)別準(zhǔn)考證號(hào)時(shí),部分準(zhǔn)考
證號(hào)的識(shí)別出現(xiàn)了亂碼(亂碼顯示為“?”)。王老師編寫了一個(gè)Python程序處理這些成績(jī),這個(gè)程序?qū)崿F(xiàn)
了以下功能:1.將csv文件中的數(shù)據(jù)用鏈表形式存儲(chǔ)在列表中,并按準(zhǔn)考證號(hào)升序排序。每位同學(xué)有兩行
數(shù)據(jù),信息成績(jī)?cè)谇?,通用成?jī)?cè)诤螅?.將這些亂碼數(shù)據(jù)去除;3.排序完成后將全年級(jí)的信息成績(jī)和通用
成績(jī)分開,前半部分為信息成績(jī),后半部分為通用成績(jī)。圖b為處理完的鏈表按順序輸出的部分截圖。
definsertnode(num,grade,p):
node=[num,grade,p]
a.append(node)
return①
csv_file=open(,score2.csv,,*r*)#打開存有準(zhǔn)考證號(hào)和成績(jī)的文件
flines=csv_file.readlines()#將文件中的數(shù)據(jù)按行讀入flines中,返回一個(gè)列表
csv_file.close()
a=[];head=l
foriinranged,len(flines)1,2):#跳過第一行標(biāo)題
xx=flines[i].stripC\n).splitC,J)#每行數(shù)據(jù)去除換行符號(hào),返回以:為分隔符的列
表
ty=flines[i+l].strip(J\n).split[,')
if'?'inxx[0]:#若準(zhǔn)考證存在亂碼
continue
p=head
pre=head
whilep!=landxx[0]>a[p][0]:
pre=p
②
文件懈能杳有
ifp=head:準(zhǔn)考證號(hào),成績(jī)
202008480,18
head=insertnode(xx[0],xx[l],p)202008480,33
202008319,19
202008319,23
pre=head202008333,20
202008333,20
202083775,22
else:202083775,27
202007294,23
202007294,18
a[pre][2]=insertnode(xx[0],xx[l],p)202007439,24
202007439,32
202009871,24
202009871,14
202008445,25
a[pre][2]=insertnode(ty[0],ty[1],p)202008445,28
#將信息和通用成績(jī)分開存儲(chǔ)第10題圖ascore2.csv文件
cur=head
last=a[cur][2][12020021781,’42L516]
tmp=last「2020036271’49L512]
「2020036291’481296]
whilea[cur][2]!=1anda[last][2]!=1:
[1202007230,,’41L476]
a[cur][2]=a[last][2];cur=a[cur][2][1202007288,,'471,82]
a[last][2]=a[cur][2];last=a[last][2][,202007289,,,31]510]
a[cur][2]-④[,202007290,,’48]6]
[1202007294,,,231126]
p=head#輸出鏈表
[,2020073231,'33L100]
whilep!=l:
第10題圖b輸出鏈表數(shù)據(jù)部分截圖
print(a[p])
p=a[p][2]
H.掃描算法是一種電梯的調(diào)度算法,電梯在最底層(1樓)和最頂層(20樓)之間連續(xù)往返掃描并運(yùn)行,
在運(yùn)行過程中優(yōu)先處理與當(dāng)前電梯運(yùn)行方向相同的請(qǐng)求,比如:當(dāng)前電梯在3樓,方向?yàn)橄蛏希藭r(shí)有3
個(gè)人請(qǐng)求使用電梯:7樓去16樓、2樓去9樓、6樓去1樓,則電梯先向上運(yùn)行,依次在7樓和16樓
??浚蝗缓笤傧蛳逻\(yùn)行,依次在6樓和1樓停靠,最后再向上運(yùn)行,依次在2樓和9樓??俊P∶骶帉?/p>
Python程序?qū)崿F(xiàn)這個(gè)調(diào)度算法,運(yùn)行界面如圖所示,請(qǐng)回答下列問題。
(1)Python程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。
defscan(now,d):#scan函數(shù)的功能:從當(dāng)前樓層開始,按當(dāng)前運(yùn)行方向掃描一趟
i二0
whilei<=len(ask)1:
ifask[i][2]==dand①:
stop[ask[i][0]]=1
stop[ask[i][1]]=1
ask.pop(i)#刪除索引為i的列表元素
當(dāng)前樓層:3方向:向上
else:
上
靠
樓層716
i=i+1
下
樓層
靠61
上
樓層
ask=[[7,16,0],[2,9,0],[6,1,0]]靠29
direct={1:〃向上”,1:〃向下〃}
now=3:d=1
print(〃當(dāng)前樓層:",now,"方向:",direct[d])
foriinrange(len(ask)):
t=②
t=t//abs(t)
ask[i][2]=t#t表示該請(qǐng)求的電梯運(yùn)行方向
whilelen(ask)>0:
stop=[0]*21#標(biāo)記120各樓層是否停靠
scan(now,d)
print(〃\n〃,direct[d],停靠樓層:〃,end=〃〃)
ifd==1:
st=1;ed=21
nownext=20
else:
st=20;ed=0
now_next=1
foriinrange(st,ed,d):
ifstop[i]==1:
print(i,end二〃〃)
now=now_next
(2)若電梯當(dāng)前在3樓,方向?yàn)橄蛏希?/p>
ask=[[7,16,0],[6,1,0],[2,9,0],[17,1,0],[10,15,0]],
則第一趟向上運(yùn)行依次??康臉菍邮牵?按停靠順序填寫數(shù)字)。
12.某校工會(huì)組織包粽子比賽,為體現(xiàn)團(tuán)隊(duì)協(xié)作,每個(gè)工會(huì)小組派5名選手參加,以接力賽形式完成15個(gè)
粽子的制作,要求每名選手至少包1個(gè),最多包5個(gè),且只能上場(chǎng)一次。現(xiàn)在高二年級(jí)組5名選手的包粽
子成績(jī)保存在文檔data,txt中,如第18題圖a所示:
您data.txt-記事本
文件(F)編輯(E)格式(可直看(V)都助(H)
066140240342448-
160121192274360
4OU1^1QUOccc
356116178276396萬某總時(shí)耗:988
|462126200280370|第12題圖aI各選手需包粽子數(shù)目:23334I第12題圖b
文檔數(shù)據(jù)共5行,6歹U,每行數(shù)據(jù)分別是某選手編號(hào)、該選手累計(jì)包1到5個(gè)粽子的耗時(shí)(由于勞累因素
等影響,連續(xù)包的粽子越多,速度越慢或不變,絕不會(huì)變快)。請(qǐng)利用python編程設(shè)計(jì)方案,分配每位選
手需要包的粽子個(gè)數(shù),使小組接力用時(shí)最短(接力時(shí)換人時(shí)間忽略不計(jì))。運(yùn)行界面如第18題圖b所示:
f=openC(1)"r")#數(shù)據(jù)文件與程序文件在同一目錄
a=[]
c=[l]*5#每位選手至少包1個(gè)粽子
forlineinf.readlines():
t=line.split()#將以空格分隔的數(shù)字字串存儲(chǔ)在列表t
score=list(map(int,t))#將列表各元素轉(zhuǎn)換成整數(shù)存儲(chǔ)在列表score中
a.append(score)
pos=l
ans=0
b=[[0],[0],[0],[0],[0]]胱[i][j]表示第i位選手包第j個(gè)粽子所需的時(shí)間
foriinrange(0,5):
b[i].append(a[i][1])
forjinrange(2,6):
b[i].append(^2))
foriinrange(10):#每位選手至少包1個(gè)粽子,另10個(gè)粽子需分配
minx=1000000
forjinrange(5):
ifb[j][c[j]+l]<minxandc[j]+l<-5:
pos=j
⑶
c[pos]+=l
foriinrange(5):
ans+=_______(4)________
print(〃方案總時(shí)耗:”,ans)
print(〃各選手需包粽子數(shù)目:〃,c[0],c[1],c[2],c[3],c[4])
13.一個(gè)整數(shù)序列,如果兩個(gè)相鄰元素的差恰好正負(fù)(負(fù)正)交替出現(xiàn),則稱為該序列為搖擺序列。小王同
學(xué)想求出某個(gè)數(shù)列的最長(zhǎng)搖擺子序列。以序列[3,14,7,6,9,12,10,8,13,5]為例,整體不是搖擺序列,但子
序列[3,14,7,9]、[3,14,6,12]等都屬于搖擺子序列,其中最長(zhǎng)的搖擺子序列是[3,14,6,12,8,13,5]。根據(jù)
第16題圖a分析得知,當(dāng)序列有一段連續(xù)的遞增(或遞減)時(shí),可形成搖擺子序列,我們只需要找到每一
次轉(zhuǎn)折中的拐點(diǎn)元素。小王編寫了一個(gè)Python程序?qū)崿F(xiàn)該功能:程序運(yùn)行時(shí),輸入一串用逗號(hào)分隔和結(jié)束
的數(shù)字,可以得到最長(zhǎng)搖擺序列的長(zhǎng)度,以及具體的序列。程序運(yùn)行界面如下圖所示:
(1)若輸入數(shù)據(jù)“2,4,5,3,2,1”,則最長(zhǎng)搖擺子序列為—
(2)實(shí)現(xiàn)上述功能的Python代碼如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。
deff(n):
f=1
globalansftglobal表示此處的ans就是全局變量ans
ans=str(a[n1])
請(qǐng)輸入以逗號(hào)分隔和結(jié)束的數(shù)據(jù)(木超過加個(gè)數(shù));3,14,7,6,9,12,10,8,13,
foriinrange(n2,1,1):最長(zhǎng)搖擺子序列長(zhǎng)度為6
最長(zhǎng)搖擺子序列為?3,14,6,12,8,13
ifb[i]:
f=f+1
①
returnf
s二input(〃請(qǐng)輸入以逗號(hào)分隔和結(jié)束的數(shù)據(jù)(不超過20個(gè)數(shù)):〃)
a=[0]*20;b=[False]*20;flag,n,i,t,ans=0,0,0,
forchins:
?ci〃〃
ifch==,:
a[i]=int(t);n+=1;i+=1;t=
else:
t二t+ch
foriinrange(1,n):
gd=True
ifflag==0:
ifa[i]>a[i1]:
flag=1
elifa[i]<a[i1]:
flag=2
else:
gd=False
elifflag=1anda[i]<a[i1]:
flag=2
elif②:
flag=1
else:
gd=False
iff(n)<3:
print(〃不構(gòu)成搖擺子序列”)
else:
print("最長(zhǎng)搖擺子序列長(zhǎng)度為",str(f(n)))
print("最長(zhǎng)搖擺子序列為:",ans)
參考答案
1.B2.C3.A4.C5.D
6.(1)b[i]=i+1(2)k=b[k](3)b[7]=b[k](4)b[q]=b[k](5)k=b[k]
7.(1)①1(2分)②head=i(2分)③points[p]=i(2分)@p=points[p](2分)
根據(jù)程序可知,先讀取文件csv中的數(shù)據(jù)存入列表a中,Points為一維列表,存儲(chǔ)指針。head的初值為1,
表示鏈表初始狀態(tài)的頭指針。列表a為二維列表,其中a[0]為標(biāo)題項(xiàng),因此從第1項(xiàng)開始遍歷,當(dāng)
float(a[i][5])>0成立,說明盈虧為正,此時(shí)將head更新為i,即第一個(gè)為盈虧為正的索引即為頭指針,
②處答案為head=i。將p的值賦值為i,即p為前驅(qū)節(jié)點(diǎn)。指向下一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年石棉摩擦制品項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)電動(dòng)玩具飛機(jī)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年橡膠發(fā)泡墊項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)手搖交直流發(fā)電機(jī)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年履帶式自動(dòng)數(shù)粒包裝線項(xiàng)目可行性研究報(bào)告
- 2025年交變負(fù)荷試驗(yàn)機(jī)項(xiàng)目可行性研究報(bào)告
- 2025年202含氫硅油項(xiàng)目可行性研究報(bào)告
- 2025至2030年金屬沙發(fā)項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2030年蓄熱瓷管項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2030年電動(dòng)日期編碼機(jī)項(xiàng)目投資價(jià)值分析報(bào)告
- 上海中學(xué)國(guó)際部幼升小面試真題
- 贏在團(tuán)隊(duì)執(zhí)行力課件
- 慢性胰腺炎課件
- 北京理工大學(xué)應(yīng)用光學(xué)課件第四章
- 陰道鏡幻燈課件
- 2022年山東司法警官職業(yè)學(xué)院?jiǎn)握姓Z文試題及答案解析
- PCB行業(yè)安全生產(chǎn)常見隱患及防范措施課件
- DB32∕T 186-2015 建筑消防設(shè)施檢測(cè)技術(shù)規(guī)程
- 2022年福建泉州中考英語真題【含答案】
- 汽車座椅骨架的焊接夾具畢業(yè)設(shè)計(jì)說明書(共23頁)
- 露天礦山職業(yè)危害預(yù)先危險(xiǎn)分析表
評(píng)論
0/150
提交評(píng)論