版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑施工安全防護(hù)操作合同樣本
- 設(shè)立分公司市場推廣協(xié)議
- 婦科診所主任醫(yī)師招聘協(xié)議范本
- 客戶關(guān)系管理保密協(xié)議管理辦法
- 民事請律師合同范例
- 自主聯(lián)系醫(yī)學(xué)生協(xié)議書(2篇)
- 托管合同法律規(guī)定
- 公路養(yǎng)護(hù)的合同工好嗎
- 工作內(nèi)容 擬寫合同
- 集體建設(shè)用地使用權(quán)聯(lián)營合同
- T-ZJASE 024-2023 呼吸閥定期校驗規(guī)則
- T-SHNA 0004-2023 有創(chuàng)動脈血壓監(jiān)測方法
- 新生兒疼痛評估與管理課件
- 提高學(xué)生學(xué)習(xí)策略的教學(xué)方法
- 小學(xué)開學(xué)第一課《筑夢新起點 一起向未來》課件
- 廣東省深圳市2023-2024學(xué)年上冊七年級歷史期末模擬試題(附答案)
- 客服招聘策劃方案
- 發(fā)掘無限潛能成就最好的自己主題班會課件
- 主動呼吸循環(huán)技術(shù)方案
- 醫(yī)院能源管理平臺建設(shè)方案合集
- 海南洪水影響區(qū)域評估報告
評論
0/150
提交評論