PHP工程師面試筆試分類模擬4_第1頁
PHP工程師面試筆試分類模擬4_第2頁
PHP工程師面試筆試分類模擬4_第3頁
PHP工程師面試筆試分類模擬4_第4頁
PHP工程師面試筆試分類模擬4_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

PHP工程師面試筆試分類模擬4

一、選擇題

1.取得搜索語句的結(jié)果集中的記錄總數(shù)的函數(shù)是______

A.mysql_fetchrow

B.mysql_rowid

C.mysqlnumrows

D.m(江南博哥)ysql_fetch_array

正確答案:C

[解析]對于選項(xiàng)A,mysql_fetch_row()函數(shù)的作用是從結(jié)果集中取得一行作為

數(shù)字?jǐn)?shù)組。選項(xiàng)A錯誤。

對于選項(xiàng)B,不存在mysql_rowid()函數(shù)。選項(xiàng)B錯誤。

對于選項(xiàng)C,mysql_nuni」ows()可以返回結(jié)果集中行的數(shù)目。選項(xiàng)C正

確。

對于選項(xiàng)D,mysql_fetch_array()函數(shù)從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組

或數(shù)字?jǐn)?shù)組,或二者兼有。選項(xiàng)D錯誤。

所以,本題的答案為C。

2.當(dāng)PDO對象創(chuàng)建成功以后,與數(shù)據(jù)庫的連接己經(jīng)建立,就可以使用PDO對

象了,下面不是PDO對象中的成員方法的是_____

A.errorlnfoO

B.bindParcimO

C.exec()

D.prepare()

正確答案:B

[解析]bindParam是PDOStatement類的方法,其余是PDO類的方法

(PDOStatement也有errcrlnfo方法)。

errorinfo:從數(shù)據(jù)庫返回一個含有錯誤信息的數(shù)組,如果有的詬。

exec:執(zhí)行一條SQL語句并返回影響的行數(shù)。

prepare:為執(zhí)行準(zhǔn)備一條SQL語句。

所以,本題的答案為瓦

3.下面關(guān)于面向?qū)ο蟮拿枋鲋校e誤的是

A.父類的構(gòu)造函數(shù)與析構(gòu)函數(shù)不會自動被調(diào)用

B.成員變量需要用public、protected、private修飾,在定義變量時(shí)不再需要

var關(guān)鍵字

C.父類中定義的靜態(tài)成員,不可以在子類中直接調(diào)用

D.包含抽象方法的類必須為抽象類,抽象類不能被實(shí)例化

正確答案:A

[解析]對于選項(xiàng)A,子類繼承父類,如果子類沒有構(gòu)造函數(shù)和析構(gòu)函數(shù),那么

實(shí)例化子類時(shí)會自動調(diào)用父類的構(gòu)造函數(shù)和析構(gòu)函數(shù);但如果子類只有構(gòu)造函

數(shù)沒有析構(gòu)函數(shù),那么實(shí)例化子類時(shí),自動調(diào)用的是子類的構(gòu)造函數(shù),銷毀對

象時(shí)調(diào)用父類的析構(gòu)函數(shù);如果子類沒有構(gòu)造函數(shù)只有析構(gòu)函數(shù),那么實(shí)例化

子類時(shí)會自動調(diào)用父類的構(gòu)造函數(shù),銷毀對象時(shí)調(diào)用子類的析構(gòu)函數(shù)。選項(xiàng)A

說法不完全,選項(xiàng)A錯誤。

對于選項(xiàng)B,成員變量使用了public、protected、private修飾定義變量

時(shí)是不需要v”關(guān)鍵字的。選項(xiàng)B說法正確,選項(xiàng)B錯誤。

對于選項(xiàng)C,父類中的靜態(tài)成員,子類中是不可以直接訪問的。選項(xiàng)C說

法正確,選項(xiàng)C錯誤。

對于選項(xiàng)D,一個包含抽象方法的類必須是抽象類,并且抽象類不能被實(shí)

例化。選項(xiàng)D說法正確,選項(xiàng)D錯誤。

所以,本題的答案為A。

4.當(dāng)聲明函數(shù)時(shí),不能給參數(shù)賦默認(rèn)值的是

A.當(dāng)參數(shù)是布爾值時(shí)

B.當(dāng)函數(shù)是類中的成員時(shí)

C.當(dāng)參數(shù)是通過引用傳遞時(shí)

D.當(dāng)函數(shù)只有一個參數(shù)時(shí)

E.永遠(yuǎn)不會

正確答案:c

[解析]當(dāng)基數(shù)被聲明為通過引用傳遞時(shí),不能給它賦默認(rèn)值,此時(shí)解釋器期望

獲得一個能在函數(shù)內(nèi)部進(jìn)行修改的變量。選項(xiàng)c正確。

所以,本題的答案為C。

5.考慮如下數(shù)組,能從數(shù)組$111111宜_81任3丫中找出值cat的方法是

$multi_array=array(〃red〃,〃green〃,

42二〉〃blue",

〃1-1〃、/〃〃〃1〃

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_arrayyellow']['orange']['cat,]

E.$multi_arrayyellow']['orange'][1]

正確答橐:E

[解析]$multi_array數(shù)組是一個多維數(shù)組,值cat在orange數(shù)組中,鍵名

1,orange又在yellow,數(shù)組中,所以獲得cat值的方法應(yīng)該為

$multi_array[,yellow'][Jorange*][1]。選項(xiàng)E正確。

所以,本題的答案為E。

6.以下代碼的執(zhí)行結(jié)果為

<?php

$num="24thiz〃+6;

echo$IIUIII;

?>

A.30

B.24thiz6

C.6

D.30thiz

正確答案:A

[解析]$num被賦值為字符串“24thiz”與6相加,字符串會被轉(zhuǎn)換成整型,具

體的轉(zhuǎn)換有以下規(guī)則:①如果字符串以數(shù)字開頭且和字母(或符號)搭配,那么

會舍棄字母(或符號)部分直接轉(zhuǎn)換為開頭的數(shù)字,所以“24thiz”轉(zhuǎn)換得到

24;②如果是字符串開頭加數(shù)字,那么字符串轉(zhuǎn)換成整型得到的是0,例如,

“abcllO”得到的是0;③如果是數(shù)字0開頭或以數(shù)字0開頭和字母(或符號)搭

配的字符串,那么它們被轉(zhuǎn)換成整型時(shí)開頭的數(shù)字0是被舍棄的,例如,字符

串“05abc”和“05”轉(zhuǎn)換成數(shù)字時(shí)都是得到5。

對于本題而言,“24thiz”被轉(zhuǎn)換成整型得到24,最后$num=24+6得到結(jié)

果30。選項(xiàng)A正確。

所以,本題的答案為A。

7.在PHP中,總是包含所有總客戶端發(fā)出的Cookies數(shù)據(jù)的變量數(shù)組是

A.$_COOKIE

B.$COOKIES

C.$_GETCookie

D.$GETCookieS

if確答案:A

[解析]獲取客戶端發(fā)出的Cookies數(shù)據(jù)是通過$_C()OKIE方法進(jìn)行獲取的。

所以,本題的答案為A。

8.以下代碼能正確在瀏覽器中顯示圖片的是

A.<?php

$img=imagecreatefromjpeg(z,images/scce.jpg〃);

readfile("image.jpg〃);

?>

A.一張JPEG圖片

B.一個二進(jìn)制件

C.下載一個二進(jìn)制件

D.下載一張JPEG圖片

E.錯誤提示

正確答案:D

[解析]header("Content-type:image/jpeg〃)可以指定瀏覽器輸出一張圖片,

readfileO函數(shù)可以輸出文件。如果輸出文件成功,那么會輸出文件中讀入的

字節(jié)數(shù),如果輸出文件失敗,那么返回False。因?yàn)榇嬖趇mage,jpg文件,所以

會直接下載image,jpg圖片。選項(xiàng)D正確。

所以,本題的答案為D。

10.如果用+操作符把一個字符串和一個整型數(shù)字相加,那么結(jié)果是

A.解釋器輸出一個類型錯誤

B.字符串將被轉(zhuǎn)換成數(shù)字,再與整型數(shù)字相加

C.字符串將被丟棄,只保留整型數(shù)字

D.字符串和整型數(shù)字將連接成一個新字符串

E.整型數(shù)字將被丟棄,而保留字符串

正確答案:B

[解析]字潤串將被轉(zhuǎn)換成數(shù)字(如果無法發(fā)生轉(zhuǎn)換,那么就是0),然后與整型

數(shù)字相加。

所以,本題的答案為B。

二、填空題

1.語句echointval((0.7+0.1)*10);的打印結(jié)果為。

正確答案:

7

[解析]由于浮點(diǎn)數(shù)的精度是有限的,因此它在內(nèi)存中存儲的是一個近似值,而

不是準(zhǔn)確的值。對于((0.1+0.7)*10),在內(nèi)存中實(shí)際存儲的值為

7.999999....,當(dāng)通過intval把它轉(zhuǎn)換為整型的時(shí)候(向下取整),轉(zhuǎn)換的結(jié)果

就是7。正因?yàn)槿绱耍跅l件判斷的時(shí)候一般不能通過“二二”來比較兩個浮點(diǎn)數(shù)

是否相等。

2.從隊(duì)列數(shù)組隊(duì)頭刪除數(shù)據(jù)可以使用函數(shù)o

正確答案:

array_shift()

3.Nginx主要使用的網(wǎng)絡(luò)協(xié)議是、、、。

正確答案:

TCP/IP、HTTP、HTTPS、Webstocket等網(wǎng)絡(luò)協(xié)議

4.在PHP中,用來獲取瀏覽器屬性的方法是o

正確答案:

$_SERVER[,HTTP_USER_AGENT,]

5.執(zhí)行程序段V?phpecho8%(-2);?>將輸出。

正確答案:

0

[解析]因?yàn)?能夠被-2整除,所以,8對-2求余后輸出得到0。

三、簡答題

1.MySQL的索引都有哪些?

正確答案:

MySQL的索引如下:

1)唯一索引。唯一索引避免了表中存在重復(fù)的數(shù)據(jù),提高了檢索速度。創(chuàng)

建唯一索引的目的是避免表中插入重復(fù)的數(shù)據(jù),從而提高表的查詢速度。

2)普通索引。普通索引允許被索引的數(shù)據(jù)列包含重復(fù)的值。優(yōu)點(diǎn)如下:①

簡化MySQL對這個索引的管理工作,使工作更有效率;②MySQL會對新插入的數(shù)

據(jù)自動檢測是否有重復(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)的索引來使用,但不能當(dāng)作B或(B,C)來使用。

6)索引的長度。在為char和varchar類型的數(shù)據(jù)列定義索引時(shí),可以把

索引的長度限制為一個給定的字符個數(shù),這個數(shù)字必須小于這個字段所允許的

最大字符個數(shù)。

7)全文索引。針對內(nèi)容開頭的字符進(jìn)行檢索操作,如果檢索的內(nèi)容由多個

字段構(gòu)成,數(shù)據(jù)量很大,那么全文索引是必要的。注意,MySQL的InnoDB引擎

不支持全文搜索索引。

2.Session的運(yùn)行機(jī)制是什么?

正確答案:

Session是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能

就是使用散列表)來保存信息。

當(dāng)程序需要為某個客戶端的請求創(chuàng)建一個Session的時(shí)候,服務(wù)器首先檢

查這個客戶端的請求里是否已包含了一個Session標(biāo)識SessionTD,如果已包含

一個SessionlD,則說明已經(jīng)為此客戶端創(chuàng)建Session,服務(wù)器就按照

SessionTD把這個Session檢索出來使用;如果客戶端請求不包含SessionTD,

則為此客戶端創(chuàng)建一個Session并且生成一個與此Session相關(guān)聯(lián)的

SessionlD,SessionlD的值應(yīng)該是一個既不會重復(fù),又不容易被找到規(guī)律以仿

造的字符串,這個SessionlD將被在本次響應(yīng)中返回給客戶端保存。

3.請簡單介紹什么是視圖。

正確答案:

視圖是A或據(jù)庫的基本表中選取出來的數(shù)據(jù)組成的邏輯窗口,它不同于基本

表,是一個虛表,在數(shù)據(jù)庫中,存放的只是視圖的定義而已,而不存放視圖包

含的數(shù)據(jù)項(xiàng),這些項(xiàng)目仍然存放在原來的基本表結(jié)構(gòu)中。

視圖的作用非常多,主要有以下幾點(diǎn):首先,可以簡化數(shù)據(jù)查詢語句;其

次,可以使用戶從多角度看待同一數(shù)據(jù);再次,通過引入視圖,可以提高數(shù)據(jù)

的安全性;最后,視圖提供了一定程度的邏輯獨(dú)立性等。

通過引入視圖機(jī)制,用戶可以將注意力集中在其關(guān)心的數(shù)據(jù)上而非全部數(shù)

據(jù),這樣就大大提高了用戶效率與用戶滿意度,而且如果這些數(shù)據(jù)來源于多個

基本表結(jié)構(gòu),或者數(shù)據(jù)不僅來自于基本表結(jié)構(gòu),還有一部分?jǐn)?shù)據(jù)來源于其他視

圖,并且搜索條件又比較復(fù)雜,那么需要編寫的查詢語句就會比較煩瑣,此時(shí)

定義視圖就可以使數(shù)據(jù)的查詢語句變得簡單可行。定義視圖可以將表與表之間

的復(fù)雜操作連接和搜索條件對用戶不可見,用戶只需要簡單地對一個視圖進(jìn)行

查詢即可,所以增加了數(shù)據(jù)的安全性,但是不能提高查詢的效率。

4.組合與繼承的區(qū)別是什么?

正確答案:

組合和繼承是面向?qū)ο笾袃煞N代碼復(fù)用的方式。組合是指在新類里面引用原有

類的對象,重復(fù)利用已有類的功能。繼承是面向?qū)ο蟮闹饕匦灾?,它允許

設(shè)計(jì)人員根據(jù)其他類的實(shí)現(xiàn)來定義一個類的實(shí)現(xiàn)。組合和繼承都允許在新的類

中設(shè)置子對象(subobject),只是組合是顯式的,而繼承則是隱式的。組合和繼

承存在著對應(yīng)關(guān)系:組合中的整體類和繼承中的子類對應(yīng),組合中的局部類和

繼承中的父類對應(yīng)。

二者的區(qū)別在哪里呢?首先分析一個實(shí)例。Car表示汽車對象,Vehicle表

示交通工具對象,Tire表示輪胎對象。三者的類關(guān)系如下圖所示。

從上圖中可以看出,Car是Vehicle的一種,因此是一種繼承關(guān)系(又被稱

為is-a關(guān)系);而Car包含了多個Tire,因此是一種組合關(guān)系(又被稱為has-a

關(guān)系)。其實(shí)現(xiàn)方式如下:

繼承組合

...,(classTire{

classvVerhicle{.

))

i八,,classCarextendsVerhicle{

classCarextendswVerhicletf?八

iqA>t=new1ire0;

5.什么是抽象類和接口?抽象類和接口有什么不同和相似的地方?

正確答案:

被關(guān)鍵字abstract修飾的類叫作抽象類,抽象類是不能被實(shí)例化的。被

abstract修飾的方法為抽象方法,一個類只要有一個抽象方法,這個類一定是

抽象類。

接口是通過關(guān)鍵字interface來定義的,可以指定某個類必須實(shí)現(xiàn)哪些方

法,但不需要定義這些方法的具體實(shí)現(xiàn)。PHP類只支持單重繼承,但通過接口可

以實(shí)現(xiàn)PHP類的多重繼承。

抽象類和接口的不同和相似的地方如下:

1)抽象類是一種不能被實(shí)例化的類,只能作為其他類的父類來使用。

2)抽象類是通過關(guān)鍵字abstract來聲明的。

3)抽象類與普通類相似,都包含成員變量和成員方法,兩者的區(qū)別在于,

抽象類中至少要包含一個抽象方法。

4)抽象方法沒有方法體,該方法大生就是要被子類重寫的。

5)抽象方法的格式為abstractfunctionabstractMethod();o

6)因?yàn)镻HP中只支持單重繼承,所以如果想實(shí)現(xiàn)多重繼承,那么就要使用

接口。也就是說,子類可以實(shí)現(xiàn)多個接口。

7)接口類是通過interface關(guān)鍵字來聲明的,接口類中的成員變量和方法

都是public的,可以不用顯式地使用public來修飾。

8)接口中的方法沒有方法體。接口中的方法天生就是要被子類繼承實(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處在棧頂。

正確答案:

最容易想到的辦法是申請一個額外的隊(duì)列,先把棧中的元素依次出棧放到隊(duì)列

里,然后把隊(duì)列里的元素按照出隊(duì)列順序入棧,這樣就可以實(shí)現(xiàn)棧的翻轉(zhuǎn),這

種方法的缺點(diǎn)是需要申請額外的空間存儲隊(duì)列,因此,空間復(fù)雜度較高。下面

介紹一種空間復(fù)雜度較低的遞歸的方法。

遞歸程序有兩個關(guān)鍵因素需要注意:遞歸定義和遞歸終止條件。經(jīng)過分析

后,很容易得到該問題的遞歸定義和遞歸終止條件。遞歸定義:將當(dāng)前棧的最

底元素移到棧頂,其他元素順次下移一位,然后對不包含棧頂元素的子棧進(jìn)行

同樣的操作。終止條件:遞歸下去,直到棧為空。遞歸的調(diào)用過程如下圖所

zj\o

雌I:枝低元素移動到板項(xiàng)

榭午2:遞歸潮fl除檢頂元素的子根

-2

在上圖中,對于棧(1,2,3,4,5)進(jìn)行翻轉(zhuǎn)的操作:首先把棧底元素移

動到棧頂?shù)玫綏?5,1,2,3,4),然后對不包含棧頂元素的子棧進(jìn)行遞歸調(diào)用

(對子棧元素進(jìn)行翻轉(zhuǎn)),子棧(1,2,3,4)翻轉(zhuǎn)的結(jié)果為(4,3,2,1),因

此,最終得到翻轉(zhuǎn)后的棧為(5,4,3,2,Do

此外,由于棧的后進(jìn)先出的特點(diǎn),使得只能取棧頂?shù)脑兀虼?,要把?/p>

底的元素移動到棧頂也需要遞歸調(diào)用才能完成,主要思路:把不包含該棧頂元

素的子棧棧底的元素移動到子棧的棧頂,然后把棧頂?shù)脑嘏c子棧棧頂?shù)脑?/p>

(其實(shí)就是與棧頂相鄰的元素)進(jìn)行交換,如下圖所示。

遞歸調(diào)用

一返回子棧調(diào)用的結(jié)果并交換子棧的棧頂元素與棧頂元素一

為了容易理解遞歸調(diào)用,可以認(rèn)為在進(jìn)行遞歸調(diào)用的時(shí)候,子棧已經(jīng)實(shí)現(xiàn)

了把棧底元素移動到了棧項(xiàng),在上圖中為了把棧(1,2,3,4,5)的棧底元素5

移動到棧頂,首先對子棧(2,3,4,5)進(jìn)行遞歸調(diào)用,調(diào)用的結(jié)果為(5,2,

3,4),然后對子棧頂元素5,與棧頂元素1進(jìn)行交換,得到棧(5,1,2,3,

4),實(shí)現(xiàn)了把棧底元素移動到了棧頂。

示例代碼如下:

<?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$ml.ength;

/**

*初始化棧

*

*@returnvoid

*/

publicfunction_construct(){

$this->mNext=NULL;

self::$mLength=0;

}

/**

本判斷棧是否空棧

*

*@returnboolean如果為空棧返回true,否則返回false

*/

publicfunctiongetlsEmpty(){

if($this->mNext=NULL){

returntrue;

}else{

returnfalse;

)

)

/**

*將所有元素出棧

*

*?returnarray返回所有棧內(nèi)元素

*/

publicfunctiongetAHPopStackO{

$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)元素個數(shù)

*

*?returnint

*/

publicstaticfunctiongetLengthO{

returnself::$mLength;

/**

*元素進(jìn)棧

*

mixed$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->mNcxt=$p->mNext;

self::$mLength—;

returntrue;

)

/**

*返回棧內(nèi)所有元素

*

*@returnarray棧內(nèi)所有元素組成的一個數(shù)組

*/

publicfunctiongetAllElemO(

$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->getAllElemO;

$element=$list[0];

return$element;

}

/*

**函數(shù)功能:把棧底元素移動到棧頂

*/

publicfunctionir.ove_bottom_to_top()

{-

if($this->getIsEmpty())

return;

$topl=$this->top();

$this->pop();〃彈出棧頂元素

if(!$this->getIsEmpty()){

〃遞歸處理不包含棧頂元素的子棧

$this->movebottomtotop();

$top2=$this->top();

$this->pop();

〃交換棧頂元素與子棧棧頂元素

$this->push($topl);

$this->push($top2);

}else{

$this->push($topl);

}

}

publicfunulionleverseslack()

{"

if($this->getIsEmpty())

return;

〃把棧底元素移動到棧頂

$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(,T);

$stack->reverse_stack();

echo〃翻轉(zhuǎn)后的出彩順序?yàn)?〃;

while(!$stack->getIsEmpty())

(

echo$stack->top()."“;

$stack->pop();

)

?>

程序的運(yùn)行結(jié)果為

翻轉(zhuǎn)后的出棧順序?yàn)椋?4321

算法性能分析:把棧底元素移動到棧頂操作的時(shí)間復(fù)雜度為0(n),在翻轉(zhuǎn)

操作中對每個子棧都進(jìn)行了把棧底元素移動到棧頂?shù)牟僮?,因此,翻轉(zhuǎn)算法的

時(shí)間復(fù)雜度為0(22)。

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的均勻分布

fundioniand7()

{

returnrand()%7+l;

}

〃產(chǎn)生的隨機(jī)數(shù)是整數(shù)1?10的均勻分布

functionrandlO()

{

$x=0;

do

(

$x=(rand7()T)*7+rand7();

}while($x>40);

return$x%10+l;

}

for($i=0;$i!=10;++$i)

printfrand10());

printf(〃\n〃);

?>

程序的運(yùn)行結(jié)果為

610818638107

[解析]要保證randlOO產(chǎn)生的隨機(jī)數(shù)是整數(shù)1?10的均勻分布,可以構(gòu)造一個

1?10*n的均勻分布的隨機(jī)整數(shù)區(qū)間(n為任何正整數(shù))。假設(shè)x是這個1?10*n

區(qū)間上的一個隨機(jī)數(shù),那么x%10+l就是均勻分布在1?10區(qū)間上的整數(shù)。

根據(jù)題意,rand7()函數(shù)返回1?7的隨機(jī)數(shù),那么rand7()-l則得到一個

離散整數(shù)集合,該集合為{0,1,2,3,4,5,6),集合中每個整數(shù)的出現(xiàn)概率

都為1/7。那么(rand7()T)*7得到另一個離散整數(shù)集合A,該集合元素為7的

整數(shù)倍,即A={0,7,14,21,28,35,42),其中,每個整數(shù)的出現(xiàn)概率也都

為1/7。而由于rand7()得到的集合B={1,2,3,4,5,6,7),其中每個整數(shù)

出現(xiàn)的概率也為1/70顯然集合A與集合B中任何兩個元素和組合可以與1?49

之間的一個整數(shù)一一對應(yīng),即1?49之間的任何一個數(shù),可以唯一地確定A和B

中兩個元素的一種組合方式,這個結(jié)論反過來也成立。由于集合A和集合B中

元素可以看成是獨(dú)立事件,根據(jù)獨(dú)立事件的概率公式P(AB)=P(A)P(B),得到每

個組合的概率是1/7*1/7=1/49。因此,(rand7()-l)*7+rand7()生成的整數(shù)均勻

分布在1?49之間,而且,每個數(shù)的概率都是1/49。

所以,(rand7()T)*7+rand7()可以構(gòu)造出均勻分布在1?49的隨機(jī)數(shù),

為了將49種組合映射為1?10之間的10種隨機(jī)數(shù),就需要進(jìn)行截?cái)?即將

41?49這樣的隨機(jī)數(shù)剔除掉,得到的數(shù)1?40仍然是均勻分布在1?40的,這

是因?yàn)槊總€數(shù)都可以看成一個獨(dú)立事件。由1?40區(qū)間上的一個隨機(jī)數(shù)x,可以

得到x%10+l就是均勻分布在1-10區(qū)間上的整數(shù)。

3.公雞5文錢1只,母雞3文錢1只,小雞1文錢買3只,現(xiàn)在用100文錢

共買了100只雞,問:在這100只雞中,公雞、母雞和小雞各是多少只?(設(shè)每

種至少一只)

正確答案:

根據(jù)百錢買百雞的要求,可以設(shè)有$1只公雞,$上只母雞,$1<只小雞,并且

$i+$j+$k的總數(shù)為100,$i*5+$j*3+$k*l總價(jià)為100。依次對公雞、母雞、小

雞的總數(shù)循環(huán)求解出符合這兩個公式的最優(yōu)解。

實(shí)現(xiàn)代碼如下:

<?php

header(''Content-type:text/html;charset=utf-8〃);

for($i=l,$i<100;$i++){

for($j=l,$J<100;$j++){

for($k=l;$k<100;$k++){

if(($i+$j+$k==100)&&($i*5+$j*3+$k/3==100)){

echo〃公雞:〃.$i,'只,母雞:‘,$j,'只,小雞:,$k,'只Vbr>';

)

}

)

}

?>

程序的運(yùn)行結(jié)果為

公雞:4只,母雞:18只,小雞:78只

公雞:8只,母雞:11只,小雞:81只

公雞:12只,母雞:4只,小雞:84只

4.己知兩個鏈表headl和head2各自有序(例如升序排列),請把它們合并成

一個鏈表,要求合并后的鏈表依然有序。

正確答案:

分別用指針headl、head2來遍歷兩個鏈表,如果當(dāng)前headl指向的數(shù)據(jù)小于

head2指向的數(shù)據(jù),則將headl指向的結(jié)點(diǎn)歸入合并后的鏈表中,否則,將

head2指向的結(jié)點(diǎn)歸入合并后的鏈表中。如果有一個鏈表遍歷結(jié)束,則把未結(jié)束

的鏈表連接到合并后的鏈表尾部。

下圖以一個簡單的示例來介紹合并的具體方法。

head

headI

head?

由于鏈表按升序排列,首先通過比較鏈表第一個結(jié)點(diǎn)中元素的大小來確定

最終合并后鏈表的頭結(jié)點(diǎn);接下來每次都找兩個鏈表中剩余結(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!=nul1){

if($cuiieiil->nexl->id>$node->id){

break;

)

$current=$current->next;

}

$node->next=$current->next;

$current->next=$node;

)

〃刪除鏈表結(jié)點(diǎn)

publicfunctionfree($id){

$current=$this->headcr;

$flag'false;

while($current->next!=nul1){

//echo$current->next->id.z,---〃?$id.〃Vbr>〃;

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$uurieiil->nexl->clala.〃;

if($current->next->next==null){

break;

}

$current=$current->next;

)

}

)

/*

*合并兩個鏈表

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論