![PHP工程師面試筆試分類模擬4_第1頁(yè)](http://file4.renrendoc.com/view3/M00/28/24/wKhkFmZb9CuAAxEUAAKozF-J97g417.jpg)
![PHP工程師面試筆試分類模擬4_第2頁(yè)](http://file4.renrendoc.com/view3/M00/28/24/wKhkFmZb9CuAAxEUAAKozF-J97g4172.jpg)
![PHP工程師面試筆試分類模擬4_第3頁(yè)](http://file4.renrendoc.com/view3/M00/28/24/wKhkFmZb9CuAAxEUAAKozF-J97g4173.jpg)
![PHP工程師面試筆試分類模擬4_第4頁(yè)](http://file4.renrendoc.com/view3/M00/28/24/wKhkFmZb9CuAAxEUAAKozF-J97g4174.jpg)
![PHP工程師面試筆試分類模擬4_第5頁(yè)](http://file4.renrendoc.com/view3/M00/28/24/wKhkFmZb9CuAAxEUAAKozF-J97g4175.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PHP工程師面試筆試分類模擬4一、選擇題1.
取得搜索語(yǔ)句的結(jié)果集中的記錄總數(shù)的函數(shù)是______A.mysql_fetch_rowB.mysql_rowidC.mysql_num_rowsD.m(江南博哥)ysql_fetch_array正確答案:C[解析]對(duì)于選項(xiàng)A,mysql_fetch_row()函數(shù)的作用是從結(jié)果集中取得一行作為數(shù)字?jǐn)?shù)組。選項(xiàng)A錯(cuò)誤。
對(duì)于選項(xiàng)B,不存在mysql_rowid()函數(shù)。選項(xiàng)B錯(cuò)誤。
對(duì)于選項(xiàng)C,mysql_num_rows()可以返回結(jié)果集中行的數(shù)目。選項(xiàng)C正確。
對(duì)于選項(xiàng)D,mysql_fetch_array()函數(shù)從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組或數(shù)字?jǐn)?shù)組,或二者兼有。選項(xiàng)D錯(cuò)誤。
所以,本題的答案為C。
2.
當(dāng)PDO對(duì)象創(chuàng)建成功以后,與數(shù)據(jù)庫(kù)的連接已經(jīng)建立,就可以使用PDO對(duì)象了,下面不是PDO對(duì)象中的成員方法的是______A.errorInfo()B.bindParam()C.exec()D.prepare()正確答案:B[解析]bindParam是PDOStatement類的方法,其余是PDO類的方法(PDOStatement也有errorInfo方法)。
errorInfo:從數(shù)據(jù)庫(kù)返回一個(gè)含有錯(cuò)誤信息的數(shù)組,如果有的話。
exec:執(zhí)行一條SQL語(yǔ)句并返回影響的行數(shù)。
prepare:為執(zhí)行準(zhǔn)備一條SQL語(yǔ)句。
所以,本題的答案為B。
3.
下面關(guān)于面向?qū)ο蟮拿枋鲋?,錯(cuò)誤的是______A.父類的構(gòu)造函數(shù)與析構(gòu)函數(shù)不會(huì)自動(dòng)被調(diào)用B.成員變量需要用public、protected、private修飾,在定義變量時(shí)不再需要var關(guān)鍵字C.父類中定義的靜態(tài)成員,不可以在子類中直接調(diào)用D.包含抽象方法的類必須為抽象類,抽象類不能被實(shí)例化正確答案:A[解析]對(duì)于選項(xiàng)A,子類繼承父類,如果子類沒(méi)有構(gòu)造函數(shù)和析構(gòu)函數(shù),那么實(shí)例化子類時(shí)會(huì)自動(dòng)調(diào)用父類的構(gòu)造函數(shù)和析構(gòu)函數(shù);但如果子類只有構(gòu)造函數(shù)沒(méi)有析構(gòu)函數(shù),那么實(shí)例化子類時(shí),自動(dòng)調(diào)用的是子類的構(gòu)造函數(shù),銷毀對(duì)象時(shí)調(diào)用父類的析構(gòu)函數(shù);如果子類沒(méi)有構(gòu)造函數(shù)只有析構(gòu)函數(shù),那么實(shí)例化子類時(shí)會(huì)自動(dòng)調(diào)用父類的構(gòu)造函數(shù),銷毀對(duì)象時(shí)調(diào)用子類的析構(gòu)函數(shù)。選項(xiàng)A說(shuō)法不完全,選項(xiàng)A錯(cuò)誤。
對(duì)于選項(xiàng)B,成員變量使用了public、protected、private修飾定義變量時(shí)是不需要var關(guān)鍵字的。選項(xiàng)B說(shuō)法正確,選項(xiàng)B錯(cuò)誤。
對(duì)于選項(xiàng)C,父類中的靜態(tài)成員,子類中是不可以直接訪問(wèn)的。選項(xiàng)C說(shuō)法正確,選項(xiàng)C錯(cuò)誤。
對(duì)于選項(xiàng)D,一個(gè)包含抽象方法的類必須是抽象類,并且抽象類不能被實(shí)例化。選項(xiàng)D說(shuō)法正確,選項(xiàng)D錯(cuò)誤。
所以,本題的答案為A。
4.
當(dāng)聲明函數(shù)時(shí),不能給參數(shù)賦默認(rèn)值的是______A.當(dāng)參數(shù)是布爾值時(shí)B.當(dāng)函數(shù)是類中的成員時(shí)C.當(dāng)參數(shù)是通過(guò)引用傳遞時(shí)D.當(dāng)函數(shù)只有一個(gè)參數(shù)時(shí)E.永遠(yuǎn)不會(huì)正確答案:C[解析]當(dāng)參數(shù)被聲明為通過(guò)引用傳遞時(shí),不能給它賦默認(rèn)值,此時(shí)解釋器期望獲得一個(gè)能在函數(shù)內(nèi)部進(jìn)行修改的變量。選項(xiàng)C正確。
所以,本題的答案為C。
5.
考慮如下數(shù)組,能從數(shù)組$multi_array中找出值cat的方法是______
$multi_array=array("red","green",
42=>"blue",
"yellow"=>array("apple",9=>"pear","banana",
"orange"=>array("dog","cat","iguana"))
);A.$multi_array['yellow']['apple'][0]B.$multi_array['blue'][0]['orange'][1]C.$multi_array[3][3][2]D.$multi_array['yellow']['orange']['cat']E.$multi_array['yellow']['orange'][1]正確答案:E[解析]$multi_array數(shù)組是一個(gè)多維數(shù)組,值cat在orange數(shù)組中,鍵名1,orange又在yellow,數(shù)組中,所以獲得cat值的方法應(yīng)該為$multi_array['yellow']['orange'][1]。選項(xiàng)E正確。
所以,本題的答案為E。
6.
以下代碼的執(zhí)行結(jié)果為______
<?php
$num="24thiz"+6;
echo$num;
?>A.30B.24thiz6C.6D.30thiz正確答案:A[解析]$num被賦值為字符串“24thiz”與6相加,字符串會(huì)被轉(zhuǎn)換成整型,具體的轉(zhuǎn)換有以下規(guī)則:①如果字符串以數(shù)字開頭且和字母(或符號(hào))搭配,那么會(huì)舍棄字母(或符號(hào))部分直接轉(zhuǎn)換為開頭的數(shù)字,所以“24thiz”轉(zhuǎn)換得到24;②如果是字符串開頭加數(shù)字,那么字符串轉(zhuǎn)換成整型得到的是0,例如,“abc110”得到的是0;③如果是數(shù)字0開頭或以數(shù)字0開頭和字母(或符號(hào))搭配的字符串,那么它們被轉(zhuǎn)換成整型時(shí)開頭的數(shù)字0是被舍棄的,例如,字符串“05abc”和“05”轉(zhuǎn)換成數(shù)字時(shí)都是得到5。
對(duì)于本題而言,“24thiz”被轉(zhuǎn)換成整型得到24,最后$num=24+6得到結(jié)果30。選項(xiàng)A正確。
所以,本題的答案為A。
7.
在PHP中,總是包含所有總客戶端發(fā)出的Cookies數(shù)據(jù)的變量數(shù)組是______A.$_COOKIEB.$_COOKIESC.$_GETCookieD.$_GETCookieS正確答案:A[解析]獲取客戶端發(fā)出的Cookies數(shù)據(jù)是通過(guò)$_COOKIE方法進(jìn)行獲取的。
所以,本題的答案為A。
8.
以下代碼能正確在瀏覽器中顯示圖片的是______A.<?php
$img=imagecreatefromjpeg("images/scce.jpg");
imagejpeg($img);
imagedestroy($img);
?>B.<?php
header("content-type:image/jpeg");
$img=imagecreatefromjpeg("images/scce.jpg");
imagejpeg($img);
imagedestroy($img);
?>C.<?php
header("content-type:image/jpeg");
$img=imagecreatefromfile("images/scce.jpg");
imageout($img);
imagedestroy($img);
?>D.<?php
header("content-type:image/jpeg");
$img=imageopen("images/scce.jpg");
imagejpeg($img);
imagedestroy($img);
?>正確答案:B[解析]當(dāng)瀏覽器中顯示圖片時(shí),首先需要使用Header函數(shù)來(lái)發(fā)送頭信息,設(shè)置文件的內(nèi)容,這里可以通過(guò)Header("content-type:image/jpeg")設(shè)定內(nèi)容為一張jpeg的圖片,然后使用imagecreatefromjpeg()函數(shù)來(lái)顯示jpeg圖片或者創(chuàng)建一個(gè)新圖像,再通過(guò)imagejpeg()函數(shù)生成對(duì)應(yīng)的jpeg格式圖片,最后用imagedestroy($img)清除圖片資源。選項(xiàng)B正確。
對(duì)于選項(xiàng)A,沒(méi)有通過(guò)Header函數(shù)聲明是圖片,選項(xiàng)A錯(cuò)誤。
對(duì)于選項(xiàng)C,不存在imageout()函數(shù)生成圖片,選項(xiàng)C錯(cuò)誤。
對(duì)于選項(xiàng)D,不存在imageopen()函數(shù)打開圖片,選項(xiàng)D錯(cuò)誤。
所以,本題的答案為B。
9.
假設(shè)image.jpg存在并能夠被PHP讀取,調(diào)用以下程序時(shí),瀏覽器上顯示______
<?php
header("Content-type:image/jpeg");
?>
<?php
readfile("image.jpg");
?>A.一張JPEG圖片B.一個(gè)二進(jìn)制件C.下載一個(gè)二進(jìn)制件D.下載一張JPEG圖片E.錯(cuò)誤提示正確答案:D[解析]header("Content-type:image/jpeg")可以指定瀏覽器輸出一張圖片,readfile()函數(shù)可以輸出文件。如果輸出文件成功,那么會(huì)輸出文件中讀入的字節(jié)數(shù),如果輸出文件失敗,那么返回False。因?yàn)榇嬖趇mage.jpg文件,所以會(huì)直接下載image.jpg圖片。選項(xiàng)D正確。
所以,本題的答案為D。
10.
如果用+操作符把一個(gè)字符串和一個(gè)整型數(shù)字相加,那么結(jié)果是______A.解釋器輸出一個(gè)類型錯(cuò)誤B.字符串將被轉(zhuǎn)換成數(shù)字,再與整型數(shù)字相加C.字符串將被丟棄,只保留整型數(shù)字D.字符串和整型數(shù)字將連接成一個(gè)新字符串E.整型數(shù)字將被丟棄,而保留字符串正確答案:B[解析]字符串將被轉(zhuǎn)換成數(shù)字(如果無(wú)法發(fā)生轉(zhuǎn)換,那么就是0),然后與整型數(shù)字相加。
所以,本題的答案為B。
二、填空題1.
語(yǔ)句echointval((0.7+0.1)*10);的打印結(jié)果為______。正確答案:7[解析]由于浮點(diǎn)數(shù)的精度是有限的,因此它在內(nèi)存中存儲(chǔ)的是一個(gè)近似值,而不是準(zhǔn)確的值。對(duì)于((0.1+0.7)*10),在內(nèi)存中實(shí)際存儲(chǔ)的值為7.999999....,當(dāng)通過(guò)intval把它轉(zhuǎn)換為整型的時(shí)候(向下取整),轉(zhuǎn)換的結(jié)果就是7。正因?yàn)槿绱?,在條件判斷的時(shí)候一般不能通過(guò)“==”來(lái)比較兩個(gè)浮點(diǎn)數(shù)是否相等。
2.
從隊(duì)列數(shù)組隊(duì)頭刪除數(shù)據(jù)可以使用函數(shù)______。正確答案:array_shift()
3.
Nginx主要使用的網(wǎng)絡(luò)協(xié)議是______、______、______、______。正確答案:TCP/IP、HTTP、HTTPS、Webstocket等網(wǎng)絡(luò)協(xié)議
4.
在PHP中,用來(lái)獲取瀏覽器屬性的方法是______。正確答案:$_SERVER['HTTP_USER_AGENT']
5.
執(zhí)行程序段<?phpecho8%(-2);?>將輸出______。正確答案:0[解析]因?yàn)?能夠被-2整除,所以,8對(duì)-2求余后輸出得到0。
三、簡(jiǎn)答題1.
MySQL的索引都有哪些?正確答案:MySQL的索引如下:
1)唯一索引。唯一索引避免了表中存在重復(fù)的數(shù)據(jù),提高了檢索速度。創(chuàng)建唯一索引的目的是避免表中插入重復(fù)的數(shù)據(jù),從而提高表的查詢速度。
2)普通索引。普通索引允許被索引的數(shù)據(jù)列包含重復(fù)的值。優(yōu)點(diǎn)如下:①簡(jiǎn)化MySQL對(duì)這個(gè)索引的管理工作,使工作更有效率;②MySQL會(huì)對(duì)新插入的數(shù)據(jù)自動(dòng)檢測(cè)是否有重復(fù)的值。
3)主索引。即主鍵索引,關(guān)鍵字PRIMARY。
4)外鍵索引。外鍵約束。
5)復(fù)合索引。索引可以覆蓋多列數(shù)據(jù),例如,INDEX(columnA,columnB)。這種索引的特點(diǎn)是MySQL可以有選擇地使用索引,例如,INDEX(A,B,C)可以當(dāng)作A或(A,B)的索引來(lái)使用,但不能當(dāng)作B或(B,C)來(lái)使用。
6)索引的長(zhǎng)度。在為char和varchar類型的數(shù)據(jù)列定義索引時(shí),可以把索引的長(zhǎng)度限制為一個(gè)給定的字符個(gè)數(shù),這個(gè)數(shù)字必須小于這個(gè)字段所允許的最大字符個(gè)數(shù)。
7)全文索引。針對(duì)內(nèi)容開頭的字符進(jìn)行檢索操作,如果檢索的內(nèi)容由多個(gè)字段構(gòu)成,數(shù)據(jù)量很大,那么全文索引是必要的。注意,MySQL的InnoDB引擎不支持全文搜索索引。
2.
Session的運(yùn)行機(jī)制是什么?正確答案:Session是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息。
當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)Session的時(shí)候,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)Session標(biāo)識(shí)SessionID,如果已包含一個(gè)SessionID,則說(shuō)明已經(jīng)為此客戶端創(chuàng)建Session,服務(wù)器就按照SessionID把這個(gè)Session檢索出來(lái)使用;如果客戶端請(qǐng)求不包含SessionID,則為此客戶端創(chuàng)建一個(gè)Session并且生成一個(gè)與此Session相關(guān)聯(lián)的SessionID,SessionID的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè)SessionID將被在本次響應(yīng)中返回給客戶端保存。
3.
請(qǐng)簡(jiǎn)單介紹什么是視圖。正確答案:視圖是從數(shù)據(jù)庫(kù)的基本表中選取出來(lái)的數(shù)據(jù)組成的邏輯窗口,它不同于基本表,是一個(gè)虛表,在數(shù)據(jù)庫(kù)中,存放的只是視圖的定義而已,而不存放視圖包含的數(shù)據(jù)項(xiàng),這些項(xiàng)目仍然存放在原來(lái)的基本表結(jié)構(gòu)中。
視圖的作用非常多,主要有以下幾點(diǎn):首先,可以簡(jiǎn)化數(shù)據(jù)查詢語(yǔ)句;其次,可以使用戶從多角度看待同一數(shù)據(jù);再次,通過(guò)引入視圖,可以提高數(shù)據(jù)的安全性;最后,視圖提供了一定程度的邏輯獨(dú)立性等。
通過(guò)引入視圖機(jī)制,用戶可以將注意力集中在其關(guān)心的數(shù)據(jù)上而非全部數(shù)據(jù),這樣就大大提高了用戶效率與用戶滿意度,而且如果這些數(shù)據(jù)來(lái)源于多個(gè)基本表結(jié)構(gòu),或者數(shù)據(jù)不僅來(lái)自于基本表結(jié)構(gòu),還有一部分?jǐn)?shù)據(jù)來(lái)源于其他視圖,并且搜索條件又比較復(fù)雜,那么需要編寫的查詢語(yǔ)句就會(huì)比較煩瑣,此時(shí)定義視圖就可以使數(shù)據(jù)的查詢語(yǔ)句變得簡(jiǎn)單可行。定義視圖可以將表與表之間的復(fù)雜操作連接和搜索條件對(duì)用戶不可見(jiàn),用戶只需要簡(jiǎn)單地對(duì)一個(gè)視圖進(jìn)行查詢即可,所以增加了數(shù)據(jù)的安全性,但是不能提高查詢的效率。
4.
組合與繼承的區(qū)別是什么?正確答案:組合和繼承是面向?qū)ο笾袃煞N代碼復(fù)用的方式。組合是指在新類里面引用原有類的對(duì)象,重復(fù)利用已有類的功能。繼承是面向?qū)ο蟮闹饕匦灾?,它允許設(shè)計(jì)人員根據(jù)其他類的實(shí)現(xiàn)來(lái)定義一個(gè)類的實(shí)現(xiàn)。組合和繼承都允許在新的類中設(shè)置子對(duì)象(subobject),只是組合是顯式的,而繼承則是隱式的。組合和繼承存在著對(duì)應(yīng)關(guān)系:組合中的整體類和繼承中的子類對(duì)應(yīng),組合中的局部類和繼承中的父類對(duì)應(yīng)。
二者的區(qū)別在哪里呢?首先分析一個(gè)實(shí)例。Car表示汽車對(duì)象,Vehicle表示交通工具對(duì)象,Tire表示輪胎對(duì)象。三者的類關(guān)系如下圖所示。
從上圖中可以看出,Car是Vehicle的一種,因此是一種繼承關(guān)系(又被稱為is-a關(guān)系);而Car包含了多個(gè)Tire,因此是一種組合關(guān)系(又被稱為has-a關(guān)系)。其實(shí)現(xiàn)方式如下:繼承組合classVerhicle{}classCarextendsVerhicle{}classTire{}classCarextendsVerhicle{$t=newTire();}
5.
什么是抽象類和接口?抽象類和接口有什么不同和相似的地方?正確答案:被關(guān)鍵字abstract修飾的類叫作抽象類,抽象類是不能被實(shí)例化的。被abstract修飾的方法為抽象方法,一個(gè)類只要有一個(gè)抽象方法,這個(gè)類一定是抽象類。
接口是通過(guò)關(guān)鍵字interface來(lái)定義的,可以指定某個(gè)類必須實(shí)現(xiàn)哪些方法,但不需要定義這些方法的具體實(shí)現(xiàn)。PHP類只支持單重繼承,但通過(guò)接口可以實(shí)現(xiàn)PHP類的多重繼承。
抽象類和接口的不同和相似的地方如下:
1)抽象類是一種不能被實(shí)例化的類,只能作為其他類的父類來(lái)使用。
2)抽象類是通過(guò)關(guān)鍵字abstract來(lái)聲明的。
3)抽象類與普通類相似,都包含成員變量和成員方法,兩者的區(qū)別在于,抽象類中至少要包含一個(gè)抽象方法。
4)抽象方法沒(méi)有方法體,該方法天生就是要被子類重寫的。
5)抽象方法的格式為abstractfunctionabstractMethod();。
6)因?yàn)镻HP中只支持單重繼承,所以如果想實(shí)現(xiàn)多重繼承,那么就要使用接口。也就是說(shuō),子類可以實(shí)現(xiàn)多個(gè)接口。
7)接口類是通過(guò)interface關(guān)鍵字來(lái)聲明的,接口類中的成員變量和方法都是public的,可以不用顯式地使用public來(lái)修飾。
8)接口中的方法沒(méi)有方法體。接口中的方法天生就是要被子類繼承實(shí)現(xiàn)的。
9)子類繼承抽象類使用extends關(guān)鍵字,子類實(shí)現(xiàn)接口使用implements關(guān)鍵字。
四、編程題1.
翻轉(zhuǎn)(也叫顛倒)棧的所有元素,例如,輸入棧(1,2,3,4,5),其中,1處在棧頂,翻轉(zhuǎn)之后的棧為(5,4,3,2,1),其中,5處在棧頂。正確答案:最容易想到的辦法是申請(qǐng)一個(gè)額外的隊(duì)列,先把棧中的元素依次出棧放到隊(duì)列里,然后把隊(duì)列里的元素按照出隊(duì)列順序入棧,這樣就可以實(shí)現(xiàn)棧的翻轉(zhuǎn),這種方法的缺點(diǎn)是需要申請(qǐng)額外的空間存儲(chǔ)隊(duì)列,因此,空間復(fù)雜度較高。下面介紹一種空間復(fù)雜度較低的遞歸的方法。
遞歸程序有兩個(gè)關(guān)鍵因素需要注意:遞歸定義和遞歸終止條件。經(jīng)過(guò)分析后,很容易得到該問(wèn)題的遞歸定義和遞歸終止條件。遞歸定義:將當(dāng)前棧的最底元素移到棧頂,其他元素順次下移一位,然后對(duì)不包含棧頂元素的子棧進(jìn)行同樣的操作。終止條件:遞歸下去,直到棧為空。遞歸的調(diào)用過(guò)程如下圖所示。
在上圖中,對(duì)于棧(1,2,3,4,5)進(jìn)行翻轉(zhuǎn)的操作:首先把棧底元素移動(dòng)到棧頂?shù)玫綏?5,1,2,3,4),然后對(duì)不包含棧頂元素的子棧進(jìn)行遞歸調(diào)用(對(duì)子棧元素進(jìn)行翻轉(zhuǎn)),子棧(1,2,3,4)翻轉(zhuǎn)的結(jié)果為(4,3,2,1),因此,最終得到翻轉(zhuǎn)后的棧為(5,4,3,2,1)。
此外,由于棧的后進(jìn)先出的特點(diǎn),使得只能取棧頂?shù)脑兀虼?,要把棧底的元素移?dòng)到棧頂也需要遞歸調(diào)用才能完成,主要思路:把不包含該棧頂元素的子棧棧底的元素移動(dòng)到子棧的棧頂,然后把棧頂?shù)脑嘏c子棧棧頂?shù)脑?其實(shí)就是與棧頂相鄰的元素)進(jìn)行交換,如下圖所示。
為了容易理解遞歸調(diào)用,可以認(rèn)為在進(jìn)行遞歸調(diào)用的時(shí)候,子棧已經(jīng)實(shí)現(xiàn)了把棧底元素移動(dòng)到了棧項(xiàng),在上圖中為了把棧(1,2,3,4,5)的棧底元素5移動(dòng)到棧頂,首先對(duì)子棧(2,3,4,5)進(jìn)行遞歸調(diào)用,調(diào)用的結(jié)果為(5,2,3,4),然后對(duì)子棧頂元素5,與棧頂元素1進(jìn)行交換,得到棧(5,1,2,3,4),實(shí)現(xiàn)了把棧底元素移動(dòng)到了棧頂。
示例代碼如下:
<?php
header("content-type:text/html;charset=utf-8");
classLNode{
public$mElem;
public$mNext;
publicfunction__construct(){
$this->mElem=NULL;
$this->mNext=NULL;
}
}
classStackLinked{
//頭“指針”,指向棧頂元素
public$mNext;
publicstatic$mLength;
/**
*初始化棧
*
*@returnvoid
*/
publicfunction__construct(){
$this->mNext=NULL;
self::$mLength=0;
}
/**
*判斷棧是否空棧
*
*@returnboolean如果為空棧返回true,否則返回false
*/
publicfunctiongetIsEmpty(){
if($this->mNext==NULL){
returntrue;
}else{
returnfalse;
}
}
/**
*將所有元素出棧
*
*@returnarray返回所有棧內(nèi)元素
*/
publicfunctiongetAllPopStack(){
$e=array();
if(!$this->getIsEmpty()){
while($this->mNext!=NULL){
$e[]=$this->mNext->mElem;
$this->mNext=$this->mNext->mNext;
}
}
self::$mLength=0;
return$e;
}
/**
*返回棧內(nèi)元素個(gè)數(shù)
*
*@returnint
*/
publicstaticfunctiongetLength(){
returnself::$mLength;
}
/**
*元素進(jìn)棧
*
*@parammixed$e進(jìn)棧元素值
*@returnboolean進(jìn)棧成功返回true
**/
publicfunctionpush($e){
$newLn=newLNode();
$newLn->mElem=$e;
$newLn->mNext=$this->mNext;
$this->mNext=&$newLn;
self:;$mLength++;
returntrue;
}
/**
*元素出棧
*
*@returnboolean出棧成功返回true,否則返回false
**/
publicfunctionpop(){
if($this->getIsEmpty()){
returnfalse;
}
$p=$this->mNext;
$e=$p->mElem;
$this->mNext=$p->mNext;
self::$mLength--;
returntrue;
}
/**
*返回棧內(nèi)所有元素
*
*@returnarray棧內(nèi)所有元素組成的一個(gè)數(shù)組
*/
publicfunctiongetAllElem(){
$sldata=array();
if(!$this->getIsEmpty()){
$p=$this->mNext;
while($p!=NULL){
$sldata[]=$p->mElem;
$p=$p->mNext;
}
return$sldata;
}
}
/*
*返回棧頂元素
*@return$element返回棧頂元素
*/
publicfunctiontop()
{
if($this->getIsEmpty()){
returnfalse;
}
$list=$this->getAllElem();
$element=$list[0];
return$element;
}
/*
**函數(shù)功能:把棧底元素移動(dòng)到棧頂
*/
publicfunctionmove_bottom_to_top()
{
if($this->getIsEmpty())
return;
$topl=$this->top();
$this->pop();//彈出棧頂元素
if(!$this->getIsEmpty()){
//遞歸處理不包含棧頂元素的子棧
$this->move_bottom_to_top();
$top2=$this->top();
$this->pop();
//交換棧頂元素與子棧棧頂元素
$this->push($top1);
$this->push($top2);
}else{
$this->push($top1);
}
}
publicfunctionreverse_stack()
{
if($this->getIsEmpty())
return;
//把棧底元素移動(dòng)到棧頂
$this->move_bottom_to_top();
$top=$this->top();
$this->pop();
//遞歸處理子棧
$this->reverse_stack();
$this->push($top);
}
}
$stack=newStackLinked();
$stack->push('5');
$stack->push('4');
$stack->push('3');
$stack->push('2');
$stack->push('1');
$stack->reverse_stack();
echo"翻轉(zhuǎn)后的出棧順序?yàn)?";
while(!$stack->getIsEmpty())
{
echo$stack->top()."";
$stack->pop();
}
?>
程序的運(yùn)行結(jié)果為
翻轉(zhuǎn)后的出棧順序?yàn)椋?4321
算法性能分析:把棧底元素移動(dòng)到棧頂操作的時(shí)間復(fù)雜度為O(n),在翻轉(zhuǎn)操作中對(duì)每個(gè)子棧都進(jìn)行了把棧底元素移動(dòng)到棧頂?shù)牟僮鳎虼?,翻轉(zhuǎn)算法的時(shí)間復(fù)雜度為O(N^2)。
2.
已知隨機(jī)數(shù)生成函數(shù)rand7()能產(chǎn)生的隨機(jī)數(shù)是整數(shù)1~7的均勻分布,如何構(gòu)造rand10()函數(shù),使其產(chǎn)生的隨機(jī)數(shù)是整數(shù)1~10的均勻分布。正確答案:<?php
∥產(chǎn)生的隨機(jī)數(shù)是整數(shù)1~7的均勻分布
functionrand7()
{
returnrand()%7+1;
}
//產(chǎn)生的隨機(jī)數(shù)是整數(shù)1~10的均勻分布
functionrand10()
{
$x=0;
do
{
$x=(rand7()-1)*7+rand7();
}while($x>40);
return$x%10+1;
}
for($i=0;$i!=10;++$i)
printf("%d",rand10());
printf("\n");
?>
程序的運(yùn)行結(jié)果為
610818638107[解析]要保證rand10()產(chǎn)生的隨機(jī)數(shù)是整數(shù)1~10的均勻分布,可以構(gòu)造一個(gè)1~10*n的均勻分布的隨機(jī)整數(shù)區(qū)間(n為任何正整數(shù))。假設(shè)x是這個(gè)1~10*n區(qū)間上的一個(gè)隨機(jī)數(shù),那么x%10+1就是均勻分布在1~10區(qū)間上的整數(shù)。
根據(jù)題意,rand7()函數(shù)返回1~7的隨機(jī)數(shù),那么rand7()-1則得到一個(gè)離散整數(shù)集合,該集合為{0,1,2,3,4,5,6},集合中每個(gè)整數(shù)的出現(xiàn)概率都為1/7。那么(rand7()-1)*7得到另一個(gè)離散整數(shù)集合A,該集合元素為7的整數(shù)倍,即A={0,7,14,21,28,35,42},其中,每個(gè)整數(shù)的出現(xiàn)概率也都為1/7。而由于rand7()得到的集合B={1,2,3,4,5,6,7},其中每個(gè)整數(shù)出現(xiàn)的概率也為1/7。顯然集合A與集合B中任何兩個(gè)元素和組合可以與1~49之間的一個(gè)整數(shù)一一對(duì)應(yīng),即1~49之間的任何一個(gè)數(shù),可以唯一地確定A和B中兩個(gè)元素的一種組合方式,這個(gè)結(jié)論反過(guò)來(lái)也成立。由于集合A和集合B中元素可以看成是獨(dú)立事件,根據(jù)獨(dú)立事件的概率公式P(AB)=P(A)P(B),得到每個(gè)組合的概率是1/7*1/7=1/49。因此,(rand7()-1)*7+rand7()生成的整數(shù)均勻分布在1~49之間,而且,每個(gè)數(shù)的概率都是1/49。
所以,(rand7()-1)*7+rand7()可以構(gòu)造出均勻分布在1~49的隨機(jī)數(shù),為了將49種組合映射為1~10之間的10種隨機(jī)數(shù),就需要進(jìn)行截?cái)啵磳?1~49這樣的隨機(jī)數(shù)剔除掉,得到的數(shù)1~40仍然是均勻分布在1~40的,這是因?yàn)槊總€(gè)數(shù)都可以看成一個(gè)獨(dú)立事件。由1~40區(qū)間上的一個(gè)隨機(jī)數(shù)x,可以得到x%10+1就是均勻分布在1~10區(qū)間上的整數(shù)。
3.
公雞5文錢1只,母雞3文錢1只,小雞1文錢買3只,現(xiàn)在用100文錢共買了100只雞,問(wèn):在這100只雞中,公雞、母雞和小雞各是多少只?(設(shè)每種至少一只)正確答案:根據(jù)百錢買百雞的要求,可以設(shè)有$i只公雞,$j只母雞,$k只小雞,并且$i+$j+$k的總數(shù)為100,$i*5+$j*3+$k*1總價(jià)為100。依次對(duì)公雞、母雞、小雞的總數(shù)循環(huán)求解出符合這兩個(gè)公式的最優(yōu)解。
實(shí)現(xiàn)代碼如下:
<?php
header("Content-type:text/html;charset=utf-8");
for($i=1,$i<100;$i++){
for($j=1,$j<100;$j++){
for($k=1;$k<100;$k++){
if(($i+$j+$k==100)&&($i*5+$j*3+$k/3==100)){
echo"公雞:".$i,'只,母雞:',$j,'只,小雞:',$k,'只<br>';
}
}
}
}
?>
程序的運(yùn)行結(jié)果為
公雞:4只,母雞:18只,小雞:78只
公雞:8只,母雞:11只,小雞:81只
公雞:12只,母雞:4只,小雞:84只
4.
己知兩個(gè)鏈表head1和head2各自有序(例如升序排列),請(qǐng)把它們合并成一個(gè)鏈表,要求合并后的鏈表依然有序。正確答案:分別用指針head1、head2來(lái)遍歷兩個(gè)鏈表,如果當(dāng)前head1指向的數(shù)據(jù)小于head2指向的數(shù)據(jù),則將head1指向的結(jié)點(diǎn)歸入合并后的鏈表中,否則,將head2指向的結(jié)點(diǎn)歸入合并后的鏈表中。如果有一個(gè)鏈表遍歷結(jié)束,則把未結(jié)束的鏈表連接到合并后的鏈表尾部。
下圖以一個(gè)簡(jiǎn)單的示例來(lái)介紹合并的具體方法。
由于鏈表按升序排列,首先通過(guò)比較鏈表第一個(gè)結(jié)點(diǎn)中元素的大小來(lái)確定最終合并后鏈表的頭結(jié)點(diǎn);接下來(lái)每次都找兩個(gè)鏈表中剩余結(jié)點(diǎn)的最小值鏈接到被合并的鏈表后面,如上圖中的虛線所示。在實(shí)現(xiàn)的時(shí)候需要注意,要釋放head2鏈表的頭結(jié)點(diǎn),具體實(shí)現(xiàn)代碼如下:
<?php
//鏈表結(jié)點(diǎn)
classnode{
public$id;
//結(jié)點(diǎn)id
public$data;
//結(jié)點(diǎn)名稱
public$next;
//下一結(jié)點(diǎn)
publicfunction__construct($id,$data){
$this->id=$id;
$this->data=$data;
$this->next=null;
}
}
//單鏈表
classlinkList{
public$header;
//鏈表頭結(jié)點(diǎn)
//構(gòu)造方法
publicfunction___construct($id=null,$data=null){
$this->header=newnode($id,$data,null);
}
//添加結(jié)點(diǎn)數(shù)據(jù)
publicfunctionaddLink($node){
$current=$this->header;
while($current->next!=null){
if($current->next->id>$node->id){
break;
}
$current=$current->next;
}
$node->next=$current->next;
$current->next=$node;
}
//刪除鏈表結(jié)點(diǎn)
publicfunctionfree($id){
$current=$this->header;
$flag=false;
while($current->next!=null){
//echo$current->next->id."---".$id."<br>";
if($current->next->id==$id){
$flag=true;
break;
}
$current=$current->next;
}
if($flag){
$current->next=$current->next->next;
}else{
echo"未找到id=".$id."的結(jié)點(diǎn)!<br>";
}
}
//清空鏈表
publicfunctionclear(){
$this->header=null;
}
//獲取鏈表
publicfunctiongetLinkList(){
$current=$this->header;
if($current->next==null){
echo("鏈表為空!");
return;
}
while($current->next!=null){
echo$current->next->data."";
if($current->next->next==
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025人教版初中七下數(shù)學(xué)湖北專版8.1第2課時(shí)-算術(shù)平方根及其應(yīng)用【課件】
- 小學(xué)一年級(jí)數(shù)學(xué)兩位數(shù)加減一位數(shù)質(zhì)量監(jiān)控例題
- 小學(xué)三年級(jí)數(shù)學(xué)五千以內(nèi)加減法綜合考核口算題大全附答案
- 11.3 動(dòng)能和勢(shì)能 提升練習(xí)含解析-八年級(jí)物理下冊(cè)(人教版)
- 實(shí)習(xí)轉(zhuǎn)正申請(qǐng)書
- 餐飲業(yè)季度盤點(diǎn)
- 研究之路模板
- 醫(yī)患調(diào)解申請(qǐng)書
- 轉(zhuǎn)臨床專業(yè)申請(qǐng)書
- 限價(jià)房申請(qǐng)書
- 產(chǎn)品設(shè)計(jì)思維 課件 第3-5章 產(chǎn)品設(shè)計(jì)的問(wèn)題思維、產(chǎn)品設(shè)計(jì)的功能思維、產(chǎn)品設(shè)計(jì)的形式思維
- 餐券模板完整
- 2023年節(jié)能服務(wù)行業(yè)市場(chǎng)分析報(bào)告及未來(lái)發(fā)展趨勢(shì)
- 小區(qū)排水管網(wǎng)修復(fù)施工方案
- 智慧城市發(fā)展-人工智能技術(shù)在城市管理中的應(yīng)用
- 因產(chǎn)品質(zhì)量買賣合同糾紛起訴狀
- GB/T 6892-2023一般工業(yè)用鋁及鋁合金擠壓型材
- 評(píng)估胎兒健康的技術(shù)
- 實(shí)驗(yàn)室危險(xiǎn)廢物處理廢液分類與收集
- 全自動(dòng)甘蔗剝?nèi)~裝置的設(shè)計(jì)
- 生物技術(shù)制藥課件
評(píng)論
0/150
提交評(píng)論