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

下載本文檔

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

文檔簡(jiǎn)介

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

以下代碼的運(yùn)行結(jié)果是______

if($i=""){

echo"a";

}else{

echo"b";

}A.輸出(江南博哥)aB.輸出bC.條件不足,無(wú)法確定D.運(yùn)行出錯(cuò)正確答案:B[解析]因?yàn)閕f條件內(nèi)的$i是被賦值為空,在PHP中,空字符串、0、false、空數(shù)組都被認(rèn)為是假,所以該程序執(zhí)行else部分,輸出b。選項(xiàng)B正確。

所以,本題的答案為B。

2.

如下代碼:

<?php

$fruits=array('strawberry'=>'red','banana'=>'yellow');

?>

不能夠正確得到結(jié)果'yellow'的代碼是______A.echo"Abananais{$fruits['banana']}";B.echo"Abananais$fruits['banana']";C.echo"Abananais{$fruits[banana]}";D.echo"Abananais$fruits[banana]";正確答案:B[解析]對(duì)于選項(xiàng)A,在字符串中用{}包括變量可以告訴編譯器花括號(hào)內(nèi)是一個(gè)變量,選項(xiàng)A是可以直接把yellow輸出的,選項(xiàng)A錯(cuò)誤。

對(duì)于選項(xiàng)B,$fruits['banana']變量被雙引號(hào)包括時(shí),編譯器會(huì)認(rèn)為單引號(hào)也是鍵名的一部分,$fruits的鍵名就不是“banana”而是“'banana'”了,導(dǎo)致執(zhí)行編譯時(shí)得不到這個(gè)鍵名而報(bào)錯(cuò),如果需要輸出這個(gè)變量,那么可以直接寫(xiě)成$fruits[banana]進(jìn)行輸出。選項(xiàng)B正確。

對(duì)于選項(xiàng)C,用{}括起來(lái)的$fruits[banana]在編譯時(shí)編譯器知道是變量,然后會(huì)判斷banana是不是一個(gè)常量,如果不是常量,那么就會(huì)被自動(dòng)轉(zhuǎn)換成字符串輸出對(duì)應(yīng)鍵名的值,所以可以得到y(tǒng)ellow,但是輸出前會(huì)出現(xiàn)Notice提示這里的banana鍵名問(wèn)題。選項(xiàng)C錯(cuò)誤。

對(duì)于選項(xiàng)D,雙引號(hào)包括的數(shù)組鍵名不用加單引號(hào),否則編譯器會(huì)認(rèn)為單引號(hào)也是鍵名的一部分,所以$fruits[banana]沒(méi)有單引號(hào)是正確的。選項(xiàng)D錯(cuò)誤。

所以,本題的答案為B。

3.

以下沒(méi)有PHP擴(kuò)展庫(kù)的DBMS是______A.MySQLB.IBMDB/2C.PostgreSQLD.MicrosoftSQLServerE.以上都不對(duì)正確答案:E[解析]PHP支持大部分的數(shù)據(jù)庫(kù)連接使用。對(duì)于PostgreSQL和MySQL數(shù)據(jù)庫(kù),PHP都擁有對(duì)應(yīng)的擴(kuò)展庫(kù)。訪問(wèn)IBMDB/2可以用ODBC擴(kuò)展,訪問(wèn)MicrosoftSQLServer可以用TDS和mssql擴(kuò)展。選項(xiàng)E正確。

所以,本題的答案為E。

4.

在PHP面向?qū)ο笾?,下面關(guān)于final修飾符的描述中,錯(cuò)誤的是______A.使用final標(biāo)識(shí)的類不能被繼承B.在類中使用final標(biāo)識(shí)的成員方法,在子類中不能被覆蓋C.不能使用final標(biāo)識(shí)成員屬性D.使用final標(biāo)識(shí)的成員屬性,不能在子類中再次定義正確答案:D[解析]因?yàn)閒inal只能修飾類與方法,不能修飾類的屬性。選項(xiàng)D正確。

所以,本題的答案為D。

5.

以下關(guān)于PHP命名空間的說(shuō)法中,不正確的是______A.訪問(wèn)任意全局類、函數(shù)或常量,都可以使用完全限定名稱,例如,\strlen()或\Exception或INT_ALLB.關(guān)鍵字namespace可用來(lái)顯式訪問(wèn)當(dāng)前命名空間或子命名空間中的元素,它等價(jià)于類中的this操作符C.任意合法的PHP代碼都可以包含在命名空間中,但只有三種類型的代碼受命名空間的影響,它們是類、函數(shù)和常量D.常量__NAMESPACE__的值是當(dāng)前命名空間名稱的字符串。如果是在全局中,那么它不包括任何命名空間中的代碼,本身是一個(gè)空字符串正確答案:B[解析]namespace關(guān)鍵字是用來(lái)聲明命名空間用的,它并不能等價(jià)于this操作符的功能。所以,選項(xiàng)B說(shuō)法不對(duì)。

所以,本題的答案為B。

6.

Gethostbyname函數(shù)的作用是______A.返回某個(gè)主機(jī)名的IPB.返回某個(gè)主機(jī)名的所有IP列表C.以長(zhǎng)整型數(shù)的形式返回某個(gè)主機(jī)的IPD.以長(zhǎng)整型數(shù)的形式返回某個(gè)主機(jī)的所有IP列表E.以上都不對(duì)正確答案:B[解析]gethostbynamel()函數(shù)的作用是根據(jù)主機(jī)名獲取該主機(jī)名的所有IP列表。選項(xiàng)B正確。

所以,本題的答案為B。

7.

假設(shè)定義了一個(gè)testclass類,它的構(gòu)造函數(shù)的函數(shù)名是______A.__constructB.InitializeC.TestclassD.__testclassE.只有PHP5才支持構(gòu)造函數(shù)正確答案:A[解析]構(gòu)造函數(shù)默認(rèn)為_(kāi)_construct()函數(shù),或者是類名和函數(shù)名相同,該函數(shù)功能等價(jià)于構(gòu)造函數(shù)。選項(xiàng)A正確,選項(xiàng)B選項(xiàng)C選項(xiàng)D錯(cuò)誤。

所以,本題的答案為A。

8.

畢業(yè)典禮后,某宿舍三位同學(xué)把自己的畢業(yè)帽扔了,隨后每個(gè)人隨機(jī)地拾起帽子,三個(gè)人中沒(méi)有人選到自己原來(lái)戴的帽子的概率是______A.1/2B.1/3C.1/4D.1/6正確答案:B[解析]本題中,不考慮任何情況,撿到帽子的情況有3*2*1=6種。

每個(gè)人都不能撿到自己的帽子,情況有兩種:A-c、B-a、C-b或者A-b、B-c、C-b,其中,A、B和C分別代表三位同學(xué),a、b和C分別代表AB和C三個(gè)人的帽子,那么應(yīng)該是2/6=1/3。

所以,本題的答案為B。

9.

創(chuàng)建一個(gè)自定義的流處理器的方法是______A.調(diào)用stream_wrapper_register()函數(shù),并定義一個(gè)進(jìn)行流操作的類B.用stream_wrapper_register()注冊(cè)一個(gè)處理函數(shù)C.創(chuàng)建一個(gè)和要處理的流封裝器同名的類,并用fopen()打開(kāi)D.用stream_load()加載流封裝器正確答案:A[解析]stream_wrapper_register()函數(shù)能注冊(cè)一個(gè)新的流封裝器,它需要接收操作流的類名稱。

所以,本題的答案為A。

10.

假如何老師看到擺鐘的時(shí)間是17:32,那么此時(shí)時(shí)針與分針的最小夾角是______A.25°B.26°C.28°D.32°正確答案:B[解析]首先,選定一個(gè)參考物,以12點(diǎn)正點(diǎn)刻度順時(shí)針作為參考量,首先算出時(shí)針與該參考量的偏移量,然后算出分針與該參考量的偏移量,二者相減即可求解出時(shí)針與分針的夾角。

眾所周知,時(shí)針行走一圈為360°,合12個(gè)小時(shí),所以,時(shí)針每小時(shí)轉(zhuǎn)動(dòng)的角度值為360°/12=30°,17:32的時(shí)針偏移量為30°*(5+32/60)=166°,即時(shí)針與12點(diǎn)正點(diǎn)時(shí)刻的夾角為166°。分針每走一圈為360°,合1個(gè)小時(shí)(60分鐘),所以,分針每分鐘轉(zhuǎn)動(dòng)的角度值為360°/60=6°,17:32的分針偏移量為6°*32=192°。

時(shí)針與分針的差值即為所求解,192°-166°=26°。

所以,本題的答案為B。

二、填空題1.

能讓類在整個(gè)腳本里只實(shí)例化一次的設(shè)計(jì)模式是______。正確答案:?jiǎn)卫J絒解析]單例模式是一種用于確保程序中只有一個(gè)類實(shí)例化的程序。

2.

函數(shù)______能讀取文本文件中的一行。讀取二進(jìn)制文件或者其他文件時(shí),應(yīng)當(dāng)使用______函數(shù)。正確答案:fgets(),fread()[解析]fgets()函數(shù)主要用于讀取文本文件中的一行,而fread()函數(shù)主要用于讀取二進(jìn)制文件。fseek()函數(shù)主要用于在打開(kāi)的文件中定位,fputs()函數(shù)用于寫(xiě)入文件。

3.

在PHP中,“+”操作符的功能包括______、______。正確答案:數(shù)組數(shù)據(jù)合并、變量數(shù)據(jù)相加[解析]“+”操作符可以實(shí)現(xiàn)數(shù)組的合并,但是合并遵循如下的規(guī)則:如果兩個(gè)數(shù)組存在相同的key,那么結(jié)果保留前面數(shù)組中的值,而丟棄掉后面數(shù)組中的值,如下例所示:

$a=array(

1=>'a',

);

$b=array(

2=>'b',

1=>'c'

);

$c=$a+$b;

vat_dump($c);

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

array(2){

[1]=>

string(1)"a"

[2]=>

string(1)"b"

}

“+”最常使用的功能就是實(shí)現(xiàn)變量數(shù)據(jù)的相加。

4.

可以獲得對(duì)象的類名的函數(shù)是______。正確答案:get_class()

5.

Cookie存儲(chǔ)在______,Session是將數(shù)據(jù)存儲(chǔ)在______,會(huì)話的生命周期默認(rèn)為_(kāi)_____。正確答案:客戶端;服務(wù)端;1440s[解析]Cookie存儲(chǔ)在客戶端,而Session存儲(chǔ)在服務(wù)器端,PHP中的Session默認(rèn)有效期是1440s(24min),即用戶在24min內(nèi)沒(méi)有刷新,當(dāng)前Session就會(huì)失效。如果用戶關(guān)閉了瀏覽器,Session也會(huì)消失。

三、簡(jiǎn)答題1.

正則表達(dá)式是什么?PHP中有哪些常用的與正則相關(guān)的函數(shù)?請(qǐng)寫(xiě)出一個(gè)email的正則表達(dá)式、中國(guó)手機(jī)號(hào)碼和座機(jī)號(hào)碼的正則表達(dá)式?正確答案:正則表達(dá)式是一種字符串匹配的模式,可以判斷一個(gè)字符串的組成是否滿足某種特定的模式,將匹配的子串替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。

常用的正則函數(shù)有:

1)preg_match()函數(shù)用于通過(guò)正則表達(dá)式匹配字符串。

2)preg_quote()函數(shù)可以轉(zhuǎn)義正則表達(dá)式字符。

3)preg_replace()函數(shù)用于執(zhí)行正則表達(dá)式的搜索和替換。

4)preg_replace_callback()函數(shù)可以執(zhí)行一個(gè)正則表達(dá)式搜索和使用回調(diào)替換。

5)preg_split()函數(shù)可以通過(guò)一個(gè)正則表達(dá)式分隔字符串。

email擁有固定的格式,可以根據(jù)這個(gè)格式匹配正確的email,它的正則表達(dá)式為/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/。

中國(guó)手機(jī)號(hào)碼的正則表達(dá)式如下:

/^1[3-5,8]{1}[0-9]{9)$/

座機(jī)號(hào)碼的驗(yàn)證的正則表達(dá)式如下:

/^([0,9]{3,4}-)?[0-9]{7,8}$/

2.

GET和POST的區(qū)別有哪些?正確答案:主要區(qū)別有4個(gè)方面:

1)語(yǔ)義不同,GET是獲取數(shù)據(jù),POST是提交數(shù)據(jù)。

2)HTTP協(xié)議規(guī)定GET比POST安全,因?yàn)镚ET只做讀取,不會(huì)改變服務(wù)器中的數(shù)據(jù)。但這只是規(guī)范,并不能保證請(qǐng)求方法的實(shí)現(xiàn)也是安全的。

3)GET請(qǐng)求會(huì)把附加參數(shù)帶在URL上,而POST請(qǐng)求會(huì)把提交數(shù)據(jù)放在報(bào)文內(nèi)。在瀏覽器中,URL長(zhǎng)度會(huì)被限制,所以GET請(qǐng)求能傳遞的數(shù)據(jù)有限,但HTTP協(xié)議其實(shí)并沒(méi)有對(duì)其做限制,都是瀏覽器在控制。

4)HTTP協(xié)議規(guī)定GET是冪等的,而POST不是,所謂冪等是指多次請(qǐng)求返回的結(jié)果相同。實(shí)際應(yīng)用中,并不會(huì)這么嚴(yán)格,當(dāng)GET獲取動(dòng)態(tài)數(shù)據(jù)時(shí),每次的結(jié)果可能會(huì)有所不同。

3.

與數(shù)組相關(guān)的常用函數(shù)有哪些?正確答案:與數(shù)組相關(guān)的常用函數(shù)主要有以下幾個(gè):

1)count()函數(shù),用于計(jì)算數(shù)組中的元素?cái)?shù)量,sizeof()函數(shù)是count()函數(shù)的別名。

2)sort()函數(shù),用于數(shù)組對(duì)鍵值進(jìn)行升序排序。

3)in_array()函數(shù),用于檢查數(shù)組中是否存在某個(gè)鍵值。

4)explode()函數(shù)和implode()函數(shù),用于數(shù)組與字符串相互轉(zhuǎn)換。

explode()函數(shù),通過(guò)使用一個(gè)分隔符對(duì)字符串進(jìn)行切割,返回一個(gè)數(shù)組。例如,通過(guò)逗號(hào)對(duì)字符串進(jìn)行分割成數(shù)組:$arr=implode(",",$String)。

implode()函數(shù),通過(guò)設(shè)定一個(gè)連接符,將數(shù)組中的每個(gè)元素連接為一個(gè)字符串。例如,通過(guò)逗號(hào)對(duì)每個(gè)鍵值進(jìn)行分隔拼接成字符串:implode(",","$array")。

5)array_merge()函數(shù),可以將一個(gè)或多個(gè)數(shù)組的元素合并成一個(gè)數(shù)組,一個(gè)數(shù)組的值附加在前一個(gè)數(shù)組的后面,返回合并后的數(shù)組。但是需要注意,如果合并的數(shù)組中存在相同的字符串鍵名,那么后一個(gè)數(shù)組的鍵值會(huì)覆蓋前一個(gè)數(shù)組的鍵值。但是,如果是數(shù)字的數(shù)組鍵名,那么不存在后一個(gè)數(shù)組鍵值覆蓋前一個(gè)數(shù)組鍵值的情況。

6)array_unique()函數(shù),用于移除數(shù)組中重復(fù)的值,并返回去除重復(fù)鍵值后的數(shù)組。

7)array_shift()函數(shù),用于刪除數(shù)組中的第一個(gè)值,并且返回被刪除元素的值。

8)array_unshift()函數(shù),用于向數(shù)組的開(kāi)頭插入新元素。

9)array_push()函數(shù),用于向數(shù)組的尾部插入一個(gè)或多個(gè)元素(入棧),然后返回?cái)?shù)組的長(zhǎng)度。

10)array_pop()函數(shù),用于刪除數(shù)組中的最后一個(gè)元素(出棧)。

11)array_reverse()函數(shù),用于把數(shù)組的鍵值反向排序并返回?cái)?shù)組。

4.

請(qǐng)寫(xiě)出面向?qū)ο笾薪涌诤统橄箢惖膮^(qū)別及應(yīng)用場(chǎng)景。正確答案:1)被abstract修飾的類叫作抽象類,抽象類可以沒(méi)有抽象方法,但是一個(gè)類如果存在抽象方法,那么這個(gè)類一定是抽象類。抽象方法必須使用abstract關(guān)鍵字修飾。

2)接口中全部是抽象方法,方法不需要用abstract定義。

3)當(dāng)多個(gè)同類的類要設(shè)計(jì)一個(gè)上層時(shí),通常設(shè)計(jì)為抽象類,當(dāng)多個(gè)異構(gòu)的類要設(shè)計(jì)一個(gè)上層時(shí),通常設(shè)計(jì)為接口。

5.

一、二、三、四范式有何區(qū)別?正確答案:在設(shè)計(jì)與操作維護(hù)數(shù)據(jù)庫(kù)時(shí),最關(guān)鍵的問(wèn)題就是要確保數(shù)據(jù)正確地分布到數(shù)據(jù)庫(kù)的表中,使用正確的數(shù)據(jù)結(jié)構(gòu),不僅有助于對(duì)數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)的存取操作,還可以極大地簡(jiǎn)化應(yīng)用程序的其他內(nèi)容(查詢、窗體、報(bào)表、代碼等),正確地進(jìn)行表的設(shè)計(jì)稱為“數(shù)據(jù)庫(kù)規(guī)范化”,它的目的就是減少數(shù)據(jù)庫(kù)中的數(shù)據(jù)冗余,從而增加數(shù)據(jù)的一致性。

范化是在識(shí)別數(shù)據(jù)庫(kù)中的數(shù)據(jù)元素、關(guān)系,以及定義所需的表和各表中的項(xiàng)目這些初始工作之后的一個(gè)細(xì)化的過(guò)程。常見(jiàn)的范式有1NF、2NF、3NF、BCNF以及4NF。

1NF,第一范式。是指數(shù)據(jù)庫(kù)表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個(gè)值,即實(shí)體中的某個(gè)屬性不能有多個(gè)值或者不能有重復(fù)的屬性。如果出現(xiàn)重復(fù)的屬性,那么就可能需要定義一個(gè)新的實(shí)體,新的實(shí)體由重復(fù)的屬性構(gòu)成,新實(shí)體與原實(shí)體之間為一對(duì)多關(guān)系。第一范式的模式要求屬性值不可再分裂成更小部分,即屬性項(xiàng)不能是屬性組合或由組屬性組成。簡(jiǎn)而言之,第一范式就是無(wú)重復(fù)的列。例如,由“職工號(hào)”“姓名”“電話號(hào)碼”組成的表(一個(gè)人可能有一個(gè)辦公電話和一個(gè)移動(dòng)電話),這時(shí)將其規(guī)范化化為1NF可以將電話號(hào)碼分為“辦公電話”和移動(dòng)電話兩個(gè)屬性,即職工(職工號(hào),姓名,辦公電話,移動(dòng)電話)。

2NF,第二范式。第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來(lái)的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)例或行必須可以被唯一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的唯一標(biāo)識(shí)。如果關(guān)系模式R為第一范式,并且R中每一個(gè)非主屬性完全函數(shù)依賴于R的某個(gè)候選鍵,則稱R為第二范式模式。(如果A是關(guān)系模式R的候選鍵的一個(gè)屬性,則稱A是R的主屬性,否則稱A是R的非主屬性。)例如,在選課關(guān)系表(學(xué)號(hào),課程號(hào),成績(jī),學(xué)分)中,關(guān)鍵字為組合關(guān)鍵字(學(xué)號(hào),課程號(hào)),但由于非主屬性學(xué)分僅依賴于課程號(hào),對(duì)關(guān)鍵字(學(xué)號(hào),課程號(hào))只是部分依賴,而不是完全依賴,所以此種方式會(huì)導(dǎo)致數(shù)據(jù)冗余以及更新異常等問(wèn)題,解決辦法是將其分為兩個(gè)關(guān)系模式:學(xué)生表(學(xué)號(hào),課程號(hào),分?jǐn)?shù))和課程表(課程號(hào),學(xué)分),新關(guān)系通過(guò)學(xué)生表中的外關(guān)鍵字課程號(hào)聯(lián)系,在需要時(shí)進(jìn)行連接。

3NF,第三范式。如果關(guān)系模式R是第二范式,且每個(gè)非主屬性都不傳遞依賴于R的候選鍵,則稱R是第三范式的模式。例如,學(xué)生表(學(xué)號(hào),姓名,課程號(hào),成績(jī)),其中學(xué)生姓名無(wú)重名,所以該表有兩個(gè)候選碼(學(xué)號(hào),課程號(hào))和(姓名,課程號(hào)),則存在函數(shù)依賴:學(xué)號(hào)→姓名,(學(xué)號(hào),課程號(hào))→成績(jī),(姓名,課程號(hào))→成績(jī),唯一的非主屬性成績(jī)對(duì)碼不存在部分依賴,也不存在傳遞依賴,所以屬于第三范式。

BCNF。它構(gòu)建在第三范式的基礎(chǔ)上,如果關(guān)系模式R是第一范式,且每個(gè)屬性都不傳遞依賴于R的候選鍵,那么稱R為BCNF的模式。假設(shè)倉(cāng)庫(kù)管理關(guān)系表(倉(cāng)庫(kù)號(hào),存儲(chǔ)物品號(hào),管理員號(hào),數(shù)量),滿足一個(gè)管理員只在一個(gè)倉(cāng)庫(kù)工作;一個(gè)倉(cāng)庫(kù)可以存儲(chǔ)多種物品。則存在如下關(guān)系:

(倉(cāng)庫(kù)號(hào),存儲(chǔ)物品號(hào))→(管理員號(hào),數(shù)量)

(管理員號(hào),存儲(chǔ)物品號(hào))→(倉(cāng)庫(kù)號(hào),數(shù)量)

所以,(倉(cāng)庫(kù)號(hào),存儲(chǔ)物品號(hào))和(管理員號(hào),存儲(chǔ)物品號(hào))都是倉(cāng)庫(kù)管理關(guān)系表的候選碼,表中的唯一非關(guān)鍵字段為數(shù)量,它是符合第三范式的。但是,由于存在如下決定關(guān)系:

(倉(cāng)庫(kù)號(hào))→(管理員號(hào))

(管理員號(hào))→(倉(cāng)庫(kù)號(hào))

即存在關(guān)鍵字段決定關(guān)鍵字段的情況,所以其不符合BCNF范式。把倉(cāng)庫(kù)管理關(guān)系表分解為兩個(gè)關(guān)系表:倉(cāng)庫(kù)管理表(倉(cāng)庫(kù)號(hào),管理員號(hào))和倉(cāng)庫(kù)表(倉(cāng)庫(kù)號(hào),存儲(chǔ)物品號(hào),數(shù)量),這樣的數(shù)據(jù)庫(kù)表是符合BCNF范式的,消除了刪除異常、插入異常和更新異常。

4NF,第四范式。設(shè)R是一個(gè)關(guān)系模式,D是R上的多值依賴集合。如果D中成立非平凡多值依賴X—Y時(shí),X必是R的超鍵,那么稱R是第四范式的模式。例如,職工表(職工編號(hào),職工孩子姓名,職工選修課程),在這個(gè)表中同一個(gè)職工也可能會(huì)有多個(gè)職工孩子姓名,同樣,同一個(gè)職工也可能會(huì)有多個(gè)職工選修課程,即這里存在著多值事實(shí),不符合第四范式。如果要符合第四范式,那么只需要將上表分為兩個(gè)表,使它們只有一個(gè)多值事實(shí),例如,職工表一(職工編號(hào),職工孩子姓名),職工表二(職工編號(hào),職工選修課程),兩個(gè)表都只有一個(gè)多值事實(shí),所以符合第四范式。

下圖為各范式關(guān)系圖。

四、編程題1.

編寫(xiě)一個(gè)應(yīng)用程序,該程序包括2個(gè)類:Monkey類和People類。要求:

1)Monkey類中有個(gè)speak()方法,在speak方法中輸出“咿咿呀呀......”的信息。

2)People類是Monkey類的子類,在People類中重寫(xiě)方法speak(),在speak方法中輸出“不錯(cuò)嘛!會(huì)說(shuō)話了!”的信息。正確答案:根據(jù)題意,實(shí)現(xiàn)代碼如下:

<?php

classMonkey{

publicfunctionspeak(){

echo"咿咿呀呀......";

}

}

ClassPeopleextendsMonkey{

publicfunctionspeak(){

echo"不錯(cuò)嘛!會(huì)說(shuō)話了!";

}

}

?>

2.

已知三個(gè)升序整數(shù)數(shù)組a[1]、b[m]和c[n],在三個(gè)數(shù)組中各找一個(gè)元素,使得組成的三元組距離最小。三元組距離的定義是,假設(shè)a[i]、b[j]和c[k]是一個(gè)三元組,那么距離為Distance=max(|a[i]-b[j]|,|a[i]-c[k]|,|b[j]-c[k]|),請(qǐng)?jiān)O(shè)計(jì)一個(gè)求最小三元組距離的最優(yōu)算法。正確答案:functionmaxNum($a,$b,$c){

$max=$a<$b?Sb:$a;

$max=$max<$c?$c:$max;

return$max;

}

functionminNum($a,$b,$c){

$min=$a<$b?$a:$b;

$min=$min<$c?$min:$c;

return$min;

}

functiongetMinDistance($a,$aLen,$b,$bLen,$c,$cLen){

$curDist=0;

$min=0;

$minDist=max($a);

$i=0;//數(shù)組a的下標(biāo)

$j=0;//數(shù)組b的下標(biāo)

$k=0;//數(shù)組c的下標(biāo)

while(1){

$curDist=maxNum(abs($a[$i]-$b[$j]),abs($a[$i]-$c[$k]),abs($b[$j]-$c[$k]));

if($curDist<$minDist)

$minDist=$curDist;

//找出當(dāng)前遍歷到三個(gè)數(shù)組中的最小值

$min=minNum($a[$i],$b[$j],$c[$k]);

if($min==$a[$i]){

if(++$i>=$aLen)

break;

}

elseif($min==$b[$j]){

if(++$j>=$bLen)

break;

}

else{

if(++$k>=$cLen)

break;

}

}

return$minDist;

}

采用這種算法最多只需要對(duì)三個(gè)數(shù)組分別遍歷一遍,因此,時(shí)間復(fù)雜度為O(1+m+n)。[解析]假設(shè)當(dāng)前遍歷到這三個(gè)數(shù)組中的元素分別為ai、bi、ci,并且ai<=bi<=ci,此時(shí)它們的距離肯定為Di=ci-ai,那么可以分如下三種情況討論:

1)如果接下來(lái)求ai、bi、ci+1的距離,由于ci+1>=ci,此時(shí)它們的距離必定為Di+1=ci+1-ai,顯然Di+1>=Di,因此,Di+1不可能為最小距離。

2)如果接下來(lái)求ai、bi+1、ci的距離,由于bi+1>=bi,如果bi+1<=ci,此時(shí)它們的距離仍然為Di+1=ci-ai;如果bi+1>ci,那么此時(shí)它們的距離為Di+1=bi+1-ai,顯然Di+1>=Di,因此,Di+1不可能為最小距離。

3)如果接下來(lái)求ai+1、bi、ci的距離,如果ai+1<ci-|ci-ai|,此時(shí)它們的距離Di+1=max(ci-ai+1,ci=bi),顯然Di+1<Di,因此,Di+1有可能是最小距離。

綜上所述,在求最小距離的時(shí)候只需要考慮第3種情況即可。具體實(shí)現(xiàn)思路為,從三個(gè)數(shù)組的第一個(gè)元素開(kāi)始,首先求出它們的距離minDist,接著找出這三個(gè)數(shù)中最小數(shù)所在的數(shù)組,只對(duì)這個(gè)數(shù)組的下標(biāo)往后移一個(gè)位置,接著求三個(gè)數(shù)組中當(dāng)前遍歷元素的距離,如果比minDist小,則把當(dāng)前距離賦值給minDist,以此類推,直到遍歷完其中一個(gè)數(shù)組為止。

例如,給定數(shù)組$a=[3,4,5,7,15];$b=[10,12,14,16,17];$c=[20,21,23,24,37,30];

1)從三個(gè)數(shù)組中找出第一個(gè)元素3、10、20,顯然它們的距離為20-3=17。

2)由于3最小,因此,數(shù)組a往后移一個(gè)位置,求4、10、20的距離為16,由于16<17,因此,當(dāng)前數(shù)組的最小距離為16。

3)同理,對(duì)數(shù)組a后移一個(gè)位置,依次類推,直到遍歷到15的時(shí)候,當(dāng)前遍歷到三個(gè)數(shù)組中的值分別為15、10、20,最小距離為10。

4)由于10最小,因此,數(shù)組b往后移動(dòng)一個(gè)位置遍歷12,此時(shí)三個(gè)數(shù)組遍歷到的數(shù)字分別為15、12、20,距離為8,當(dāng)前最小距離是8。

5)由于12最小,數(shù)組b往后移動(dòng)一個(gè)位置為14,依然是三個(gè)數(shù)中最小值,往后移動(dòng)一個(gè)位置為16,當(dāng)前的最小距離變?yōu)?,由于15是數(shù)組a的最后一個(gè)數(shù)字,因此,遍歷結(jié)束,求得最小距離為5。

3.

給定以非遞減順序排序的三個(gè)數(shù)組,找出這三個(gè)數(shù)組中的所有公共元素。例如,給出下面三個(gè)數(shù)組:ar1=[2,5,12,20,45,85],ar2=[16,19,20,85,200],ar3=[3,4,15,20,39,72,85,190]。那么這三個(gè)數(shù)組的公共元素為[20,85]。正確答案:最容易想到的方法是首先找出兩個(gè)數(shù)組的交集,然后把這個(gè)交集存儲(chǔ)在一個(gè)臨時(shí)數(shù)組中,最后找出這個(gè)臨時(shí)數(shù)組與第三個(gè)數(shù)組的交集。這個(gè)算法的時(shí)間復(fù)雜度為O(N1+N2+N3),其中N1、N2和N3分別為三個(gè)數(shù)組的長(zhǎng)度。這種方法不僅需要額外的存儲(chǔ)空間,而且需要額外的兩次循環(huán)遍歷。下面介紹另外一種只需要一次循環(huán)遍歷,而且不需要額外存儲(chǔ)空間的方法。

假設(shè)當(dāng)前遍歷的三個(gè)數(shù)組的元素分別為ar1[i]、ar2[j]、ar3[k],則存在以下幾種可能性:

1)如果ar1[i]、ar2[j]和ar3[k]相等,那么說(shuō)明當(dāng)前遍歷的元素是三個(gè)數(shù)組的公有元素,可以直接打印出來(lái),然后通過(guò)執(zhí)行i++,j++,k++,使三個(gè)數(shù)組同時(shí)向后移動(dòng),此時(shí)繼續(xù)遍歷各數(shù)組后面的元素。

2)如果ar1[i]<ar2[j],那么執(zhí)行i++來(lái)繼續(xù)遍歷ar1中后面的元素,因?yàn)閍r1[i]不可能是三個(gè)數(shù)組公有的元素。

3)如果ar2[j]<ar3[k],同理可以通過(guò)j++來(lái)繼續(xù)遍歷ar2后面的元素。

4)如果前面的條件都不滿足,那么說(shuō)明ar1[i]>ar2[j]而且ar2[j]>ar3[k],此時(shí)可以通過(guò)k++來(lái)繼續(xù)遍歷ar3后面的元素。

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

<?php

functionfindCommon($ar1,$ar2,$ar3,$n1,$n2,$n3)

{

$i=0;

$j=0;

$k=0;

/*遍歷三個(gè)數(shù)組*/

while($i<$n1&&$j<$n2&&$k<$n3)

{

/*找到了公有的元素*/

if($ar1[$i]==$ar2[$j]&&$ar2[$j]==$ar3[$k])

{

printf("%d",$ar1[$i]);

$i++;$j++;$k++;

}

/*ar[i]不可能是公有的元素*/

elseif($ar1[$i]<$ar2[$j])

$i++;

/*ar2[j]不可能是公有的元素*/

elseif($ar2[$j]<

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論