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

下載本文檔

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

文檔簡介

PHP工程師面試筆試分類模擬4一、選擇題1.

取得搜索語句的結(jié)果集中的記錄總數(shù)的函數(shù)是______A.mysql_fetch_rowB.mysql_rowidC.mysql_num_rowsD.m(江南博哥)ysql_fetch_array正確答案:C[解析]對于選項A,mysql_fetch_row()函數(shù)的作用是從結(jié)果集中取得一行作為數(shù)字?jǐn)?shù)組。選項A錯誤。

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

對于選項C,mysql_num_rows()可以返回結(jié)果集中行的數(shù)目。選項C正確。

對于選項D,mysql_fetch_array()函數(shù)從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組或數(shù)字?jǐn)?shù)組,或二者兼有。選項D錯誤。

所以,本題的答案為C。

2.

當(dāng)PDO對象創(chuàng)建成功以后,與數(shù)據(jù)庫的連接已經(jīng)建立,就可以使用PDO對象了,下面不是PDO對象中的成員方法的是______A.errorInfo()B.bindParam()C.exec()D.prepare()正確答案:B[解析]bindParam是PDOStatement類的方法,其余是PDO類的方法(PDOStatement也有errorInfo方法)。

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

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

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

所以,本題的答案為B。

3.

下面關(guān)于面向?qū)ο蟮拿枋鲋?,錯誤的是______A.父類的構(gòu)造函數(shù)與析構(gòu)函數(shù)不會自動被調(diào)用B.成員變量需要用public、protected、private修飾,在定義變量時不再需要var關(guān)鍵字C.父類中定義的靜態(tài)成員,不可以在子類中直接調(diào)用D.包含抽象方法的類必須為抽象類,抽象類不能被實例化正確答案:A[解析]對于選項A,子類繼承父類,如果子類沒有構(gòu)造函數(shù)和析構(gòu)函數(shù),那么實例化子類時會自動調(diào)用父類的構(gòu)造函數(shù)和析構(gòu)函數(shù);但如果子類只有構(gòu)造函數(shù)沒有析構(gòu)函數(shù),那么實例化子類時,自動調(diào)用的是子類的構(gòu)造函數(shù),銷毀對象時調(diào)用父類的析構(gòu)函數(shù);如果子類沒有構(gòu)造函數(shù)只有析構(gòu)函數(shù),那么實例化子類時會自動調(diào)用父類的構(gòu)造函數(shù),銷毀對象時調(diào)用子類的析構(gòu)函數(shù)。選項A說法不完全,選項A錯誤。

對于選項B,成員變量使用了public、protected、private修飾定義變量時是不需要var關(guān)鍵字的。選項B說法正確,選項B錯誤。

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

對于選項D,一個包含抽象方法的類必須是抽象類,并且抽象類不能被實例化。選項D說法正確,選項D錯誤。

所以,本題的答案為A。

4.

當(dāng)聲明函數(shù)時,不能給參數(shù)賦默認(rèn)值的是______A.當(dāng)參數(shù)是布爾值時B.當(dāng)函數(shù)是類中的成員時C.當(dāng)參數(shù)是通過引用傳遞時D.當(dāng)函數(shù)只有一個參數(shù)時E.永遠(yuǎn)不會正確答案:C[解析]當(dāng)參數(shù)被聲明為通過引用傳遞時,不能給它賦默認(rèn)值,此時解釋器期望獲得一個能在函數(shù)內(nèi)部進(jìn)行修改的變量。選項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ù)組是一個多維數(shù)組,值cat在orange數(shù)組中,鍵名1,orange又在yellow,數(shù)組中,所以獲得cat值的方法應(yīng)該為$multi_array['yellow']['orange'][1]。選項E正確。

所以,本題的答案為E。

6.

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

<?php

$num="24thiz"+6;

echo$num;

?>A.30B.24thiz6C.6D.30thiz正確答案:A[解析]$num被賦值為字符串“24thiz”與6相加,字符串會被轉(zhuǎn)換成整型,具體的轉(zhuǎn)換有以下規(guī)則:①如果字符串以數(shù)字開頭且和字母(或符號)搭配,那么會舍棄字母(或符號)部分直接轉(zhuǎn)換為開頭的數(shù)字,所以“24thiz”轉(zhuǎn)換得到24;②如果是字符串開頭加數(shù)字,那么字符串轉(zhuǎn)換成整型得到的是0,例如,“abc110”得到的是0;③如果是數(shù)字0開頭或以數(shù)字0開頭和字母(或符號)搭配的字符串,那么它們被轉(zhuǎn)換成整型時開頭的數(shù)字0是被舍棄的,例如,字符串“05abc”和“05”轉(zhuǎn)換成數(shù)字時都是得到5。

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

所以,本題的答案為A。

7.

在PHP中,總是包含所有總客戶端發(fā)出的Cookies數(shù)據(jù)的變量數(shù)組是______A.$_COOKIEB.$_COOKIESC.$_GETCookieD.$_GETCookieS正確答案:A[解析]獲取客戶端發(fā)出的Cookies數(shù)據(jù)是通過$_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)瀏覽器中顯示圖片時,首先需要使用Header函數(shù)來發(fā)送頭信息,設(shè)置文件的內(nèi)容,這里可以通過Header("content-type:image/jpeg")設(shè)定內(nèi)容為一張jpeg的圖片,然后使用imagecreatefromjpeg()函數(shù)來顯示jpeg圖片或者創(chuàng)建一個新圖像,再通過imagejpeg()函數(shù)生成對應(yīng)的jpeg格式圖片,最后用imagedestroy($img)清除圖片資源。選項B正確。

對于選項A,沒有通過Header函數(shù)聲明是圖片,選項A錯誤。

對于選項C,不存在imageout()函數(shù)生成圖片,選項C錯誤。

對于選項D,不存在imageopen()函數(shù)打開圖片,選項D錯誤。

所以,本題的答案為B。

9.

假設(shè)image.jpg存在并能夠被PHP讀取,調(diào)用以下程序時,瀏覽器上顯示______

<?php

header("Content-type:image/jpeg");

?>

<?php

readfile("image.jpg");

?>A.一張JPEG圖片B.一個二進(jìn)制件C.下載一個二進(jìn)制件D.下載一張JPEG圖片E.錯誤提示正確答案:D[解析]header("Content-type:image/jpeg")可以指定瀏覽器輸出一張圖片,readfile()函數(shù)可以輸出文件。如果輸出文件成功,那么會輸出文件中讀入的字節(jié)數(shù),如果輸出文件失敗,那么返回False。因為存在image.jpg文件,所以會直接下載image.jpg圖片。選項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[解析]由于浮點數(shù)的精度是有限的,因此它在內(nèi)存中存儲的是一個近似值,而不是準(zhǔn)確的值。對于((0.1+0.7)*10),在內(nèi)存中實際存儲的值為7.999999....,當(dāng)通過intval把它轉(zhuǎn)換為整型的時候(向下取整),轉(zhuǎn)換的結(jié)果就是7。正因為如此,在條件判斷的時候一般不能通過“==”來比較兩個浮點數(shù)是否相等。

2.

從隊列數(shù)組隊頭刪除數(shù)據(jù)可以使用函數(shù)______。正確答案:array_shift()

3.

Nginx主要使用的網(wǎng)絡(luò)協(xié)議是______、______、______、______。正確答案:TCP/IP、HTTP、HTTPS、Webstocket等網(wǎng)絡(luò)協(xié)議

4.

在PHP中,用來獲取瀏覽器屬性的方法是______。正確答案:$_SERVER['HTTP_USER_AGENT']

5.

執(zhí)行程序段<?phpecho8%(-2);?>將輸出______。正確答案:0[解析]因為8能夠被-2整除,所以,8對-2求余后輸出得到0。

三、簡答題1.

MySQL的索引都有哪些?正確答案:MySQL的索引如下:

1)唯一索引。唯一索引避免了表中存在重復(fù)的數(shù)據(jù),提高了檢索速度。創(chuàng)建唯一索引的目的是避免表中插入重復(fù)的數(shù)據(jù),從而提高表的查詢速度。

2)普通索引。普通索引允許被索引的數(shù)據(jù)列包含重復(fù)的值。優(yōu)點如下:①簡化MySQL對這個索引的管理工作,使工作更有效率;②MySQL會對新插入的數(shù)據(jù)自動檢測是否有重復(fù)的值。

3)主索引。即主鍵索引,關(guān)鍵字PRIMARY。

4)外鍵索引。外鍵約束。

5)復(fù)合索引。索引可以覆蓋多列數(shù)據(jù),例如,INDEX(columnA,columnB)。這種索引的特點是MySQL可以有選擇地使用索引,例如,INDEX(A,B,C)可以當(dāng)作A或(A,B)的索引來使用,但不能當(dāng)作B或(B,C)來使用。

6)索引的長度。在為char和varchar類型的數(shù)據(jù)列定義索引時,可以把索引的長度限制為一個給定的字符個數(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的時候,服務(wù)器首先檢查這個客戶端的請求里是否已包含了一個Session標(biāo)識SessionID,如果已包含一個SessionID,則說明已經(jīng)為此客戶端創(chuàng)建Session,服務(wù)器就按照SessionID把這個Session檢索出來使用;如果客戶端請求不包含SessionID,則為此客戶端創(chuàng)建一個Session并且生成一個與此Session相關(guān)聯(lián)的SessionID,SessionID的值應(yīng)該是一個既不會重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個SessionID將被在本次響應(yīng)中返回給客戶端保存。

3.

請簡單介紹什么是視圖。正確答案:視圖是從數(shù)據(jù)庫的基本表中選取出來的數(shù)據(jù)組成的邏輯窗口,它不同于基本表,是一個虛表,在數(shù)據(jù)庫中,存放的只是視圖的定義而已,而不存放視圖包含的數(shù)據(jù)項,這些項目仍然存放在原來的基本表結(jié)構(gòu)中。

視圖的作用非常多,主要有以下幾點:首先,可以簡化數(shù)據(jù)查詢語句;其次,可以使用戶從多角度看待同一數(shù)據(jù);再次,通過引入視圖,可以提高數(shù)據(jù)的安全性;最后,視圖提供了一定程度的邏輯獨立性等。

通過引入視圖機(jī)制,用戶可以將注意力集中在其關(guān)心的數(shù)據(jù)上而非全部數(shù)據(jù),這樣就大大提高了用戶效率與用戶滿意度,而且如果這些數(shù)據(jù)來源于多個基本表結(jié)構(gòu),或者數(shù)據(jù)不僅來自于基本表結(jié)構(gòu),還有一部分?jǐn)?shù)據(jù)來源于其他視圖,并且搜索條件又比較復(fù)雜,那么需要編寫的查詢語句就會比較煩瑣,此時定義視圖就可以使數(shù)據(jù)的查詢語句變得簡單可行。定義視圖可以將表與表之間的復(fù)雜操作連接和搜索條件對用戶不可見,用戶只需要簡單地對一個視圖進(jìn)行查詢即可,所以增加了數(shù)據(jù)的安全性,但是不能提高查詢的效率。

4.

組合與繼承的區(qū)別是什么?正確答案:組合和繼承是面向?qū)ο笾袃煞N代碼復(fù)用的方式。組合是指在新類里面引用原有類的對象,重復(fù)利用已有類的功能。繼承是面向?qū)ο蟮闹饕匦灾?,它允許設(shè)計人員根據(jù)其他類的實現(xiàn)來定義一個類的實現(xiàn)。組合和繼承都允許在新的類中設(shè)置子對象(subobject),只是組合是顯式的,而繼承則是隱式的。組合和繼承存在著對應(yīng)關(guān)系:組合中的整體類和繼承中的子類對應(yīng),組合中的局部類和繼承中的父類對應(yīng)。

二者的區(qū)別在哪里呢?首先分析一個實例。Car表示汽車對象,Vehicle表示交通工具對象,Tire表示輪胎對象。三者的類關(guān)系如下圖所示。

從上圖中可以看出,Car是Vehicle的一種,因此是一種繼承關(guān)系(又被稱為is-a關(guān)系);而Car包含了多個Tire,因此是一種組合關(guān)系(又被稱為has-a關(guān)系)。其實現(xiàn)方式如下:繼承組合classVerhicle{}classCarextendsVerhicle{}classTire{}classCarextendsVerhicle{$t=newTire();}

5.

什么是抽象類和接口?抽象類和接口有什么不同和相似的地方?正確答案:被關(guān)鍵字abstract修飾的類叫作抽象類,抽象類是不能被實例化的。被abstract修飾的方法為抽象方法,一個類只要有一個抽象方法,這個類一定是抽象類。

接口是通過關(guān)鍵字interface來定義的,可以指定某個類必須實現(xiàn)哪些方法,但不需要定義這些方法的具體實現(xiàn)。PHP類只支持單重繼承,但通過接口可以實現(xiàn)PHP類的多重繼承。

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

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

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

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

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

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

6)因為PHP中只支持單重繼承,所以如果想實現(xiàn)多重繼承,那么就要使用接口。也就是說,子類可以實現(xiàn)多個接口。

7)接口類是通過interface關(guān)鍵字來聲明的,接口類中的成員變量和方法都是public的,可以不用顯式地使用public來修飾。

8)接口中的方法沒有方法體。接口中的方法天生就是要被子類繼承實現(xiàn)的。

9)子類繼承抽象類使用extends關(guān)鍵字,子類實現(xiàn)接口使用implements關(guān)鍵字。

四、編程題1.

翻轉(zhuǎn)(也叫顛倒)棧的所有元素,例如,輸入棧(1,2,3,4,5),其中,1處在棧頂,翻轉(zhuǎn)之后的棧為(5,4,3,2,1),其中,5處在棧頂。正確答案:最容易想到的辦法是申請一個額外的隊列,先把棧中的元素依次出棧放到隊列里,然后把隊列里的元素按照出隊列順序入棧,這樣就可以實現(xiàn)棧的翻轉(zhuǎn),這種方法的缺點是需要申請額外的空間存儲隊列,因此,空間復(fù)雜度較高。下面介紹一種空間復(fù)雜度較低的遞歸的方法。

遞歸程序有兩個關(guān)鍵因素需要注意:遞歸定義和遞歸終止條件。經(jīng)過分析后,很容易得到該問題的遞歸定義和遞歸終止條件。遞歸定義:將當(dāng)前棧的最底元素移到棧頂,其他元素順次下移一位,然后對不包含棧頂元素的子棧進(jìn)行同樣的操作。終止條件:遞歸下去,直到棧為空。遞歸的調(diào)用過程如下圖所示。

在上圖中,對于棧(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,1)。

此外,由于棧的后進(jìn)先出的特點,使得只能取棧頂?shù)脑?,因此,要把棧底的元素移動到棧頂也需要遞歸調(diào)用才能完成,主要思路:把不包含該棧頂元素的子棧棧底的元素移動到子棧的棧頂,然后把棧頂?shù)脑嘏c子棧棧頂?shù)脑?其實就是與棧頂相鄰的元素)進(jìn)行交換,如下圖所示。

為了容易理解遞歸調(diào)用,可以認(rèn)為在進(jìn)行遞歸調(diào)用的時候,子棧已經(jīng)實現(xiàn)了把棧底元素移動到了棧項,在上圖中為了把棧(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),實現(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$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)元素個數(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)所有元素組成的一個數(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ù)功能:把棧底元素移動到棧頂

*/

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;

//把棧底元素移動到棧頂

$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)后的出棧順序為:";

while(!$stack->getIsEmpty())

{

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

$stack->pop();

}

?>

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

翻轉(zhuǎn)后的出棧順序為:54321

算法性能分析:把棧底元素移動到棧頂操作的時間復(fù)雜度為O(n),在翻轉(zhuǎn)操作中對每個子棧都進(jìn)行了把棧底元素移動到棧頂?shù)牟僮?,因此,翻轉(zhuǎn)算法的時間復(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)造一個1~10*n的均勻分布的隨機(jī)整數(shù)區(qū)間(n為任何正整數(shù))。假設(shè)x是這個1~10*n區(qū)間上的一個隨機(jī)數(shù),那么x%10+1就是均勻分布在1~10區(qū)間上的整數(shù)。

根據(jù)題意,rand7()函數(shù)返回1~7的隨機(jī)數(shù),那么rand7()-1則得到一個離散整數(shù)集合,該集合為{0,1,2,3,4,5,6},集合中每個整數(shù)的出現(xiàn)概率都為1/7。那么(rand7()-1)*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/7。顯然集合A與集合B中任何兩個元素和組合可以與1~49之間的一個整數(shù)一一對應(yīng),即1~49之間的任何一個數(shù),可以唯一地確定A和B中兩個元素的一種組合方式,這個結(jié)論反過來也成立。由于集合A和集合B中元素可以看成是獨立事件,根據(jù)獨立事件的概率公式P(AB)=P(A)P(B),得到每個組合的概率是1/7*1/7=1/49。因此,(rand7()-1)*7+rand7()生成的整數(shù)均勻分布在1~49之間,而且,每個數(shù)的概率都是1/49。

所以,(rand7()-1)*7+rand7()可以構(gòu)造出均勻分布在1~49的隨機(jī)數(shù),為了將49種組合映射為1~10之間的10種隨機(jī)數(shù),就需要進(jìn)行截斷,即將41~49這樣的隨機(jī)數(shù)剔除掉,得到的數(shù)1~40仍然是均勻分布在1~40的,這是因為每個數(shù)都可以看成一個獨立事件。由1~40區(qū)間上的一個隨機(jī)數(shù)x,可以得到x%10+1就是均勻分布在1~10區(qū)間上的整數(shù)。

3.

公雞5文錢1只,母雞3文錢1只,小雞1文錢買3只,現(xiàn)在用100文錢共買了100只雞,問:在這100只雞中,公雞、母雞和小雞各是多少只?(設(shè)每種至少一只)正確答案:根據(jù)百錢買百雞的要求,可以設(shè)有$i只公雞,$j只母雞,$k只小雞,并且$i+$j+$k的總數(shù)為100,$i*5+$j*3+$k*1總價為100。依次對公雞、母雞、小雞的總數(shù)循環(huán)求解出符合這兩個公式的最優(yōu)解。

實現(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.

己知兩個鏈表head1和head2各自有序(例如升序排列),請把它們合并成一個鏈表,要求合并后的鏈表依然有序。正確答案:分別用指針head1、head2來遍歷兩個鏈表,如果當(dāng)前head1指向的數(shù)據(jù)小于head2指向的數(shù)據(jù),則將head1指向的結(jié)點歸入合并后的鏈表中,否則,將head2指向的結(jié)點歸入合并后的鏈表中。如果有一個鏈表遍歷結(jié)束,則把未結(jié)束的鏈表連接到合并后的鏈表尾部。

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

由于鏈表按升序排列,首先通過比較鏈表第一個結(jié)點中元素的大小來確定最終合并后鏈表的頭結(jié)點;接下來每次都找兩個鏈表中剩余結(jié)點的最小值鏈接到被合并的鏈表后面,如上圖中的虛線所示。在實現(xiàn)的時候需要注意,要釋放head2鏈表的頭結(jié)點,具體實現(xiàn)代碼如下:

<?php

//鏈表結(jié)點

classnode{

public$id;

//結(jié)點id

public$data;

//結(jié)點名稱

public$next;

//下一結(jié)點

publicfunction__construct($id,$data){

$this->id=$id;

$this->data=$data;

$this->next=null;

}

}

//單鏈表

classlinkList{

public$header;

//鏈表頭結(jié)點

//構(gòu)造方法

publicfunction___construct($id=null,$data=null){

$this->header=newnode($id,$data,null);

}

//添加結(jié)點數(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é)點

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é)點!<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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論