




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
某知名互聯(lián)網(wǎng)金融企業(yè)PHP工程師面試筆試真題及答案一、選擇題1、S市共有AB兩個(gè)區(qū),人口比例為3:5,據(jù)歷史統(tǒng)計(jì),A區(qū)的犯罪率為0.01%,B區(qū)的犯罪率為0.015%,現(xiàn)有一起新案件發(fā)生在S市,那么案件發(fā)生在A區(qū)的可能性是______
A.37.5%
B.32.5%
C.28.6%
D.26.1%
2、有如下代碼:
functiondouble($a){
return$a*$a;
}
$c=double(5);
則變量c的數(shù)據(jù)類型為______
A.Int
B.Float
C.Double
D.String
3、GMT時(shí)區(qū)下的時(shí)間戳與你所在時(shí)區(qū)下的時(shí)間戳的秒數(shù)差距是______
A.取決于你所在時(shí)區(qū)與GMT時(shí)區(qū)的時(shí)間差
B.沒有差別
C.只當(dāng)你也在GMT時(shí)區(qū)時(shí)才會(huì)相同
D.永遠(yuǎn)不會(huì)相同
4、下面程序的運(yùn)行結(jié)果是______
<?php
$nextWeek=time()+(7*24*60*60);
echo'Now:'.date('Y-m-d')."\\n";
echo'NextWeek:'.date('Y-m-d',$nextWeek)."\\n";
?>
A.得到今天的日期(月-日)
B.得到今天的日期(年-月-日)與下周的日期(年-月-日)
C.得到現(xiàn)在的時(shí)間(小時(shí)-分-秒)
D.得到現(xiàn)在到下周的時(shí)間間隔
5、以下能匹配字符串PHP|architect的正則表達(dá)式是______
A..*
B....|.........
C.\d{3}\|\d{8}
D.[az]{3}\|[az]{9}
E.[a-z][a-z][a-z]\|\w{9}
6、以下無法在PHP4中實(shí)現(xiàn)的面向?qū)ο蟮母拍钍莀_____
①抽象類
②Final類
③public、private、protected(PPP)方法
④接口
A.抽象類
B.PPP方法
C.PPP方法和接口
D.以上所有都不可用
E.以上所有都可用
7、以下有關(guān)PHP高級(jí)特性的說法中,正確的是______
A.可以定義一個(gè)類去實(shí)現(xiàn)預(yù)定義接口Iterator,然后就能像訪問數(shù)組一樣訪問這個(gè)類創(chuàng)建的對(duì)象
B.spla_utoload_register()提供了一種更加靈活的方式來實(shí)現(xiàn)類的自動(dòng)加載,不再建議使用autoload()函數(shù)
C.PHP在對(duì)象中調(diào)用一個(gè)不可訪問方法時(shí),invoke()方法會(huì)被自動(dòng)調(diào)用
D.匿名函數(shù)也叫閉包函數(shù),常用作回調(diào)函數(shù)參數(shù)的值,但是不能作為變量的值來使用
8、以下沒有PHP擴(kuò)展庫(kù)的DBMS是______
A.MySQL
B.IBMDB/2
C.PostgreSQL
D.MicrosoftSQLServer
E.以上都不對(duì)
9、以下代碼能正確在瀏覽器中顯示圖片的是______
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);
?>
10、如果php.ini配置允許,那么下面選項(xiàng)中,fopen()函數(shù)不支持的網(wǎng)絡(luò)協(xié)議是______
A.HTTP
B.ftp
C.mailD.zlib
二、填空題11、array_push()函數(shù)的作用是______。
12、更改mysq1的表字段名的標(biāo)準(zhǔn)語(yǔ)法為______。
13、JS表單彈出對(duì)話框函數(shù)是______,獲得輸入焦點(diǎn)函數(shù)是______。
14、在PHP中,“+”操作符的功能包括______、______。
15、<?phpecho1+2+"3+4+5";?>程序的運(yùn)行結(jié)果為______。
三、簡(jiǎn)答題16、請(qǐng)說明在php.ini中safe_mode開啟之后對(duì)于PHP系統(tǒng)函數(shù)的影響。
17、什么是數(shù)據(jù)庫(kù)三級(jí)封鎖協(xié)議?
18、什么是觀察者模式?
19、面向?qū)ο髱状笤瓌t是什么?
20、SVN與Git的區(qū)別是什么?它們的工作流程是什么?使用Git有什么好處?怎樣處理沖突?Git中基本的命令有哪些?
四、編程題21、給定一臺(tái)有m個(gè)存儲(chǔ)空間的機(jī)器,有n個(gè)請(qǐng)求需要在這臺(tái)機(jī)器上運(yùn)行,第i個(gè)請(qǐng)求計(jì)算時(shí)需要占R[i]空間,計(jì)算結(jié)果需要占O[i]個(gè)空間(O[i]<R[i])。請(qǐng)?jiān)O(shè)計(jì)一個(gè)算法,判斷這n個(gè)請(qǐng)求能否全部完成?若能,給出這n個(gè)請(qǐng)求的安排順序。
22、寫一個(gè)函數(shù),盡可能高效地從一個(gè)標(biāo)準(zhǔn)url里取出文件的擴(kuò)展名。例如,/abc/de/fg.php?id=1需要取出php或.php。
23、翻轉(zhuǎn)(也叫顛倒)棧的所有元素,例如,輸入棧(1,2,3,4,5),其中,1處在棧頂,翻轉(zhuǎn)之后的棧為(5,4,3,2,1),其中,5處在棧頂。
有一個(gè)MySQL數(shù)據(jù)庫(kù)表payment記錄用戶購(gòu)買訂單,表結(jié)構(gòu)如下:
TABLEpayment(
idintunsignedAUTO_INCREMENT,
useridintunsignedcomment'用戶id',
quantitysmallintunsignedcomment'本次購(gòu)買產(chǎn)品數(shù)量',
pay_timetimestampcomment'購(gòu)買時(shí)間',
PRIMARYKEY(id)
)
用戶每訪問成功付款一筆訂單(從進(jìn)入到離開),就會(huì)向這個(gè)表增加一條記錄,記錄用戶的ID(user_id),以及購(gòu)買的產(chǎn)品數(shù)量。比如:“208,2”,表示208這個(gè)用戶購(gòu)買2個(gè)產(chǎn)品。24、請(qǐng)寫出一個(gè)SQL語(yǔ)句挑出用戶(id=100)最近購(gòu)買的10條訂單。25、請(qǐng)寫出一個(gè)SQL語(yǔ)句挑出用戶(id=100)最近購(gòu)買的第10~20條訂單(共10個(gè))。26、請(qǐng)寫出一個(gè)SQL語(yǔ)句挑出購(gòu)買產(chǎn)品數(shù)最多的10個(gè)用戶(user_id)和對(duì)應(yīng)購(gòu)買的產(chǎn)品總數(shù)。
答案:
一、選擇題
1、C[解析]
根據(jù)題目意思可知,假設(shè)A區(qū)的人數(shù)為3X,那么,B區(qū)人口數(shù)為5X,A區(qū)犯罪的人數(shù)為3X*0.01%,B區(qū)犯罪的人數(shù)為5X*0.015%。A區(qū)犯罪的可能性=(A區(qū)犯罪人數(shù))/(A區(qū)犯罪人數(shù)+B區(qū)犯罪人數(shù))=(3X*0.01%)/(3X*0.01%+5X*0.015%)=28.6%。
所以,本題的答案為C。2、A[解析]
向double()函數(shù)內(nèi)傳入數(shù)字5,它的類型為Int,函數(shù)內(nèi)5*5得到25返回給$c,兩個(gè)Int類型的數(shù)相乘結(jié)果還是Int類型,因此$c的類型為Int。
所以,本題的答案為A。3、B[解析]GMT叫格林尼治時(shí)間,其本身就是時(shí)間戳,任何時(shí)區(qū)下的當(dāng)前時(shí)間都是相同的,當(dāng)前時(shí)間是一個(gè)絕對(duì)的時(shí)間點(diǎn),不存在秒數(shù)的差距。選項(xiàng)B正確。
所以,本題的答案為B。4、B[解析]time()函數(shù)可以獲取當(dāng)前的時(shí)間戳,而時(shí)問戳是以秒為計(jì)算的。所以$nextWeek獲取的是從當(dāng)前時(shí)間開始7天的時(shí)間秒數(shù),即下一周時(shí)間。可以通過date()函數(shù)輸出當(dāng)前時(shí)間格式或指定時(shí)間戳的時(shí)間格式。所以now對(duì)應(yīng)的是今天的日期,而nextweek對(duì)應(yīng)的是下周的時(shí)間。且格式為Y對(duì)應(yīng)年,m對(duì)應(yīng)月,d對(duì)應(yīng)日。選項(xiàng)B正確。
所以,本題的答案為B。5、E[解析]
對(duì)于選項(xiàng)A,“.*”可以表示匹配任意字符,雖然能夠匹配題目中的條件字符串,但是相對(duì)于E的正則表達(dá)式來說并不規(guī)范,選項(xiàng)A錯(cuò)誤。
對(duì)于選項(xiàng)B,并不存在這一正則表達(dá)式,選項(xiàng)B錯(cuò)誤。
對(duì)于選項(xiàng)C,“\d”表示的是匹配數(shù)字,選項(xiàng)C錯(cuò)誤。
對(duì)于選項(xiàng)D,該表達(dá)式的“[aZ]”格式不對(duì),選項(xiàng)D錯(cuò)誤。
對(duì)于選項(xiàng)E,“[a-z]”表示匹配a-z中的任意一個(gè)字母,“\|”表示轉(zhuǎn)義“|”符,“\w”表示匹配字母或數(shù)字或下劃線或漢字,“{9}”表示只能是9位。對(duì)于題目中的匹配字符串,該正則可以匹配,選項(xiàng)E正確。
所以,本題的答案為E。6、D[解析]
在PHP4.0的概念中,抽象類、final類、public、private、protected(PPP)方法都沒有實(shí)現(xiàn)。選項(xiàng)D正確。
所以,本題的答案為D。7、B[解析]
對(duì)于選項(xiàng)A,只有ArrayAccess能夠提供像訪問數(shù)組一樣訪問這個(gè)對(duì)象的接口,不能定義一個(gè)類或預(yù)定義接口Iterator去實(shí)現(xiàn)這個(gè)功能。選項(xiàng)A錯(cuò)誤。
對(duì)于選項(xiàng)B,因?yàn)榭梢酝ㄟ^spla_utoload_register()函數(shù)創(chuàng)建autoload函數(shù)的隊(duì)列,按定義順序逐個(gè)執(zhí)行,比__autoload()只可以定義一次使用更方便,所以不建議使用autoload()函數(shù)。選項(xiàng)B正確。
對(duì)于選項(xiàng)C,__call方法是在創(chuàng)建一個(gè)類實(shí)例化后就可以直接調(diào)用對(duì)象使用,當(dāng)調(diào)用的方法不可訪問或沒有權(quán)限訪問時(shí),會(huì)自動(dòng)調(diào)用__call方法。選項(xiàng)C錯(cuò)誤。
對(duì)于選項(xiàng)D,匿名函數(shù)是可以賦值給變量的。選項(xiàng)D錯(cuò)誤。
所以,本題的答案為B。8、E[解析]PHP支持大部分的數(shù)據(jù)庫(kù)連接使用。對(duì)于PostgreSQL和MySQL數(shù)據(jù)庫(kù),PHP都擁有對(duì)應(yīng)的擴(kuò)展庫(kù)。訪問IBMDB/2可以用ODBC擴(kuò)展,訪問MicrosoftSQLServer可以用TDS和mssql擴(kuò)展。選項(xiàng)E正確。
所以,本題的答案為E。9、B[解析]
當(dāng)瀏覽器中顯示圖片時(shí),首先需要使用Header函數(shù)來發(fā)送頭信息,設(shè)置文件的內(nèi)容,這里可以通過Header("content-type:image/jpeg")設(shè)定內(nèi)容為一張jpeg的圖片,然后使用imagecreatefromjpeg()函數(shù)來顯示jpeg圖片或者創(chuàng)建一個(gè)新圖像,再通過imagejpeg()函數(shù)生成對(duì)應(yīng)的jpeg格式圖片,最后用imagedestroy($img)清除圖片資源。選項(xiàng)B正確。
對(duì)于選項(xiàng)A,沒有通過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。10、C[解析]
因?yàn)閒open()函數(shù)可以打開文件或者URL,所以格式為HTTP,ftp的網(wǎng)頁(yè)路徑可以打開,zlib的文件格式也是可以打開的。但是不支持打開mail函數(shù)查看郵件。選項(xiàng)C正確。
所以,本題的答案為C。二、填空題11、將一個(gè)或多個(gè)元素壓入數(shù)組的末尾。12、altertable表名change原名新名新類型[first|after]。[解析]
修改表字段名:altertable表名CHANGE原字段名新字段名類型:
修改字段類型:altertable表名MODIFY字段名類型:
增加一個(gè)字段:altertable表名addCOLUMN字段名類型NOTNULL(或DEFAULTNULL);新增一個(gè)字段默認(rèn)不為空(或默認(rèn)為空);
刪除一個(gè)字段:altertable表名DROPCOLUMN字段名;13、alert()、prompt()、confirm();focus()。14、數(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ù)的相加。15、6。[解析]
首先運(yùn)行1+2結(jié)果為3,在執(zhí)行+"3+4+5";的時(shí)候會(huì)強(qiáng)制把這個(gè)字符串轉(zhuǎn)換為整數(shù),這個(gè)字符串轉(zhuǎn)換后的整數(shù)為3,因此最終運(yùn)行結(jié)果為3+3=6。三、簡(jiǎn)答題16、PHP中的save_mode開啟后,可以提供一個(gè)安全的共享環(huán)境,它主要對(duì)系統(tǒng)的操作、文件、權(quán)限設(shè)置等產(chǎn)生影響。但該模式在PHP5.4.0以后已經(jīng)被廢除。該模式會(huì)對(duì)以下的函數(shù)產(chǎn)生影響:
1)首先是與操作文件系統(tǒng)有關(guān)的函數(shù),這些函數(shù)訪問文件時(shí)會(huì)被限制,例如,ckdir()、move_uploaded_file()、chgrp()、parse_ini_file()、chown()、rmdir()、copy()、rename()、fopen()、require()、highlight_file()、show_source()、include()、symlink()、link()、touch()、mkdir()、unlink()等函數(shù)。
2)其次還有一些其他的函數(shù)也會(huì)有影響,例如,exec()、shell_exec()、pasathru()、system()、popen()等。
17、眾所周知,基本的封鎖類型有兩種:排它鎖(X鎖)和共享鎖(S鎖)。所謂X鎖是事務(wù)T對(duì)數(shù)據(jù)A加上X鎖時(shí),只允許事務(wù)T讀取和修改數(shù)據(jù)A。所謂S鎖是事務(wù)T對(duì)數(shù)據(jù)A加上S鎖時(shí),其他事務(wù)只能再對(duì)數(shù)據(jù)A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。若事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加了S鎖,則T就可以對(duì)A進(jìn)行讀取,但不能進(jìn)行更新(S鎖因此又稱為讀鎖),在T釋放A上的S鎖以前,其他事務(wù)可以再對(duì)A加S鎖,但不能加X鎖,從而可以讀取A,但不能更新A。
在運(yùn)用X鎖和S鎖對(duì)數(shù)據(jù)對(duì)象加鎖時(shí),還需要約定一些規(guī)則,例如,何時(shí)申請(qǐng)X鎖或S鎖、持鎖時(shí)間、何時(shí)釋放等,稱這些規(guī)則為封鎖協(xié)議(LockingProtocol)。對(duì)封鎖方式規(guī)定不同的規(guī)則,就形成了各種不同的封鎖協(xié)議。一般使用三級(jí)封鎖協(xié)議,也稱為三級(jí)加鎖協(xié)議。該協(xié)議是為了保證正確地調(diào)度事務(wù)的并發(fā)操作。三級(jí)加鎖協(xié)議是事務(wù)在對(duì)數(shù)據(jù)庫(kù)對(duì)象加鎖、解鎖時(shí)必須遵守的一種規(guī)則。下面分別介紹這三級(jí)封鎖協(xié)議。
一級(jí)封鎖協(xié)議:事務(wù)T在修改數(shù)據(jù)R之前必須先對(duì)其加X鎖,直到事務(wù)結(jié)束才釋放。事務(wù)結(jié)束包括正常結(jié)束(COMMIT)和非正常結(jié)束(ROLLBACK)。一級(jí)封鎖協(xié)議可以防止丟失修改,并保證事務(wù)T是可恢復(fù)的。使用一級(jí)封鎖協(xié)議可以解決丟失修改問題。在一級(jí)封鎖協(xié)議中,如果僅僅是讀數(shù)據(jù)不對(duì)其進(jìn)行修改,是不需要加鎖的,它不能保證可重復(fù)讀和不讀“臟”數(shù)據(jù)。
二級(jí)封鎖協(xié)議:一級(jí)封鎖協(xié)議加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對(duì)其加S鎖,讀完后方可釋放S鎖。二級(jí)封鎖協(xié)議除防止了丟失修改,還可以進(jìn)一步防止讀“臟”數(shù)據(jù)。但在二級(jí)封鎖協(xié)議中,由于讀完數(shù)據(jù)后即可釋放S鎖,所以它不能保證可重復(fù)讀。
三級(jí)封鎖協(xié)議:一級(jí)封鎖協(xié)議加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對(duì)其加S鎖,直到事務(wù)結(jié)束才釋放。三級(jí)封鎖協(xié)議除防止了丟失修改和不讀“臟”數(shù)據(jù)外,還進(jìn)一步防止了不可重復(fù)讀。
18、觀察者模式(也被稱為發(fā)布/訂閱模式)提供了避免組件之間緊密耦合的另一種方法,它將觀察者和被觀察的對(duì)象分離開。在該模式中,一個(gè)對(duì)象通過添加一個(gè)方法(該方法允許另一個(gè)對(duì)象,即觀察者注冊(cè)自己)使本身變得可觀察。當(dāng)可觀察的對(duì)象更改時(shí),它會(huì)將消息發(fā)送到已注冊(cè)的觀察者。這些觀察者使用該信息執(zhí)行的操作與可觀察的對(duì)象無關(guān),結(jié)果是對(duì)象可以相互對(duì)話,而不必了解原因。
例如,用戶界面可以作為一個(gè)觀察者,業(yè)務(wù)數(shù)據(jù)是被觀察者,用戶界面觀察業(yè)務(wù)數(shù)據(jù)的變化,發(fā)現(xiàn)數(shù)據(jù)變化后,就顯示在界而上。而向?qū)ο笤O(shè)計(jì)的一個(gè)原則是,系統(tǒng)中的每個(gè)類將重點(diǎn)放在某一個(gè)功能上,而不是其他方而。一個(gè)對(duì)象只做一件事情,并且將它做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應(yīng)用程序的可維護(hù)性和重用性。
示例代碼如下:
<?php
//觀察者接口
interfaceInterfaceObserver
{
functiononListen($sender,$args);
functiongetObserverName();
}
//可被觀察者接口
interfaceInterfaceObservable
{
functionaddObserver($observer);
functionremoveObserver($observer_name);
}
//觀察者抽象類
abstractclassObserverimplementsInterfaceObserver
{
protected$observer_name;
functiongetObserverName()
{
return$this->observer_name;
}
functiononListen($sender,$args)
{}
}
//可被觀察類
abstractclassObservableimplementsInterfaceObservable
{
protected$observers=array();
publicfunctionaddObserver($observer)
{
if($observerinstanceofInterfaceObserver)
{
$this->observers[]=$observer;
}
}
publicfunctionremoveObserver($observer_name)
{
foreach($this->observersas$index=>$observer)
{
if($observer->getObserverName()===$observer_name)
{
array_splice($this->observers,$index,1);
return;
}
}
}
}
//模擬一個(gè)可以被觀察的類
classAextendsObservable
{
publicfunctionaddListener($listener)
{
foreach($this->observersas$observer)
{
$observer->onListen($this,$listener);
}
}
}
//模擬一個(gè)觀察者類
classBextendsObserver
{
protected$observer_name='B';
publicfunctiononListen($sender,$args)
{
var_dump($sender);
echo"<br>";
var_dump($args);
echo"<br>";
}
}
//模擬另外一個(gè)觀察者類
classCextendsObserver
{
protected$observer_name='C';
publicfunctiononListen($sender,
$args)
{
var_dmnp($sender);
echo"<br>";
var_dump($args);
echo"<br>";
}
}
$a=newA();
//注入觀察者
$a->addObserver(newB());
$a->addObserver(newC());
//可以看到觀察到的信息
$a->addListener('D');
//移除觀察者
$a->removeObserver('B');
?>
19、面向?qū)ο蟠嬖谖宕蠡驹瓌t,分別是單一職責(zé)原則、開放封閉原則、替換原則、依賴倒置原則和接口隔離原則。
(1)單一職責(zé)原則
所謂單一職責(zé)原則,即一個(gè)類最好只做一件事,以提高內(nèi)聚性來減少引起變化的原因,單一原則是低耦合、高內(nèi)聚在面向?qū)ο笤瓌t上的引申。
(2)開放封閉原則
軟件的功能應(yīng)該是可擴(kuò)展的,盡可能減少修改,因?yàn)樾薷某绦蚩赡軙?huì)對(duì)原來的程序造成影響。雖然建議盡可能不修改程序,但是允許通過添加功能來減少修改。
(3)替換原則
只有子類能夠替換基類,在繼承機(jī)制的約束規(guī)范中,子類替換基類時(shí),可以保證運(yùn)行期內(nèi)識(shí)別子類,保證繼承復(fù)用。
(4)依賴倒置原則
高層模塊不依賴底層模塊,二者都依賴于抽象,抽象不依賴于實(shí)體,而實(shí)體依賴于抽象。模塊間的依賴是通過抽象方法發(fā)生的,實(shí)現(xiàn)類中不發(fā)生直接的依賴關(guān)系,而依賴關(guān)系是通過接口或抽象類產(chǎn)生的。即接口或抽象類不依賴于實(shí)現(xiàn)類,而實(shí)現(xiàn)類依賴于接口和抽象類。這種依賴倒置原則可以有效地減少類之間的耦合性,提高系統(tǒng)的穩(wěn)定性,減少并發(fā)引起的風(fēng)險(xiǎn),提高代碼的可讀性和可維護(hù)性。
(5)接口隔離原則
建議開發(fā)使用多個(gè)小的、專門的接口,避免使用一個(gè)大的總接口。即每一個(gè)功能有一個(gè)專門的功能接口,需要用到才調(diào)用,不需要全部功能匯總到一個(gè)接口,這樣可以提高代碼的靈活性,降低類之間的耦合性,提高穩(wěn)定性。
20、SVN和Git的區(qū)別如下:
1)SVN屬于集中化的版本控制系統(tǒng),使用起來更像是檔案?jìng)}庫(kù),支持并行讀寫,支持代碼的版本化管理,可以對(duì)代碼進(jìn)行取出、導(dǎo)入、更新、分支、還原、改名和合并等。
而SVN和Git一樣都有一個(gè)版本庫(kù)或服務(wù)器,被使用時(shí)是分布式模式,每個(gè)開發(fā)人員從中心版本庫(kù)或服務(wù)器上下載代碼到自己的機(jī)器,然后自己有專屬的版本庫(kù),可以對(duì)這個(gè)版本庫(kù)進(jìn)行開發(fā)管理。
2)SVN是按文件進(jìn)行存儲(chǔ),而Git是把內(nèi)容按元數(shù)據(jù)方式存儲(chǔ)。
3)SVN有一個(gè)全局的版本號(hào),而Git沒有。
4)Git的內(nèi)容完整性比SVN完整。Git對(duì)內(nèi)容存儲(chǔ)主要使用的是SHA-1哈希算法,確保了代碼內(nèi)容的完整性,即使遇到硬盤或網(wǎng)絡(luò)故障對(duì)代碼的損害都可以降低。
5)在Git上的分支可以很快速地在工作目錄下和分支間進(jìn)行切換,然后發(fā)現(xiàn)未合并的分支可以進(jìn)行合并。而SVN的分支相當(dāng)于版本庫(kù)中的另一個(gè)目錄,合并需要手動(dòng)輸入命令完成。
使用Git的好處有代碼庫(kù)占的空間小,對(duì)程序源代碼進(jìn)行差異化的版本管理,存在多個(gè)分支代碼開發(fā)等。
在提交代碼到Git中遇到?jīng)_突時(shí),可以根據(jù)開發(fā)者的反饋進(jìn)行判斷,如果是主開發(fā)者發(fā)現(xiàn)兩個(gè)開發(fā)者之間的沖突,那么可以讓他們白行解決沖突,讓其中一個(gè)人先提交代碼。如果是主開發(fā)者可以自己解決的問題,那么就自己解決沖突再上傳。
Git中主要使用的基本命令有:
1)通過Gitclone'版本庫(kù)地址'把項(xiàng)目復(fù)制到本地。
2)通過Gitadd.可以將代碼的修改全部修改提交到本地暫存區(qū)。
3)通過Gitcommit-m'注釋'使用commit命令提交添加到緩存區(qū)的文件到本地倉(cāng)庫(kù)。
4)通過Gitpush將本地分支更新的部分推送到遠(yuǎn)程主機(jī)上。四、編程題21、這道題的主要思路為,首先對(duì)請(qǐng)求按照R[i]-O[i]由大到小進(jìn)行排序,然后按照由大到小的順序進(jìn)行處理,如果按照這個(gè)順序能處理完,則這n個(gè)請(qǐng)求能被處理完,否則處理不完。那么請(qǐng)求i能完成的條件是什么呢?在處理請(qǐng)求i的時(shí)候前面所有的請(qǐng)求都已經(jīng)處理完成,那么它們所占的存儲(chǔ)空間為O[0]+O[1]+…+O[i-1],剩余的存儲(chǔ)空間left為left=m-(O[0]+O[1]+…+O[i-1]),要使請(qǐng)求i能被處理完,則必須滿足left≥R[i],只要剩余的存儲(chǔ)空間能存放R[i],那么在請(qǐng)求處理完成后就可以刪除請(qǐng)求,從而把處理的結(jié)果放到存儲(chǔ)空間中,由于O[i]<R[i],此時(shí)必定有空間存放O[i]。
至于為什么用R[i]-O[i]由大到小的順序來處理,來看下面的分析:
假設(shè)第一步處理R[i]-O[i]最大的值。使用歸納法(假設(shè)每一步都取剩余請(qǐng)求中R[i]-O[i]最大的值進(jìn)行處理),假設(shè)n=k時(shí)能處理完成,那么當(dāng)n=k+1時(shí),由于前k個(gè)請(qǐng)求是按照R[i]-O[i]從大到小排序的,在處理第k+1個(gè)請(qǐng)求時(shí),此時(shí)需要的空間為A=O[1]+…+O[i]+…+O[k]+R[k+1],只有A≤m的時(shí)候才能處理第k+1個(gè)請(qǐng)求。假設(shè)把第k+1個(gè)請(qǐng)求和前面的某個(gè)請(qǐng)求i交換位置,即不按照R[i]-O[i]由大到小的順序來處理,在這種情況下,第k+1個(gè)請(qǐng)求已經(jīng)被處理完成,接著要處理第i的請(qǐng)求,此時(shí)需要的空間為B=O[1]+…+O[i-1]+O[k+1]+O[i+1]+…+R[i],如果B>A,則說明按順序處理成功的可能性更大(越往后處理剩余的空間越小,請(qǐng)求需要的空間越小越好);如果B<A,則說明不按順序更好。根據(jù)R[i]-O[i]有序的特點(diǎn)可知:R[i]-O[i]≥R[k+1]-O[k+1],即O[k+1]+R[i]≥O[i]+R[k+1],所以,B≥A,因此,可以得出結(jié)論:方案B不會(huì)比方案A更好。即方案A是最好的方案,也就是說,按照R[i]-O[i]從大到小排序處理請(qǐng)求,成功的可能性最大。如果按照這個(gè)序列都無法完成請(qǐng)求序列,那么任何順序都無法實(shí)現(xiàn)全部完成,實(shí)現(xiàn)代碼如下:
<?php
functionswap(&$a,&$b)
{
$temp=$a;
$a
=$b;
$b
=$temp;
}
/*按照R[i]-O[i]由大到小進(jìn)行排序*/
functionbubbleSort(&$R,&$O,$len)
{
for($i=0;$i<$len-1;++$i)
{
for($j=$len-1;$j>$i;--$j)
{
if($R[$j]-$O[$j]>$R[$j-1]-$O[$j-1])
{
swap($R[$j],$R[$j-1]);
swap($O[$j],$O[$j-1]);
}
}
}
}
functionschedule(&$R,&$O,$len,$M)
{
bubbleSort($R,$O,$len);
$left=$M;//剩余可用的空間數(shù)
$i;
for($i=0;$i<$len;$i++)
{
if($left<$R[$i])
//剩余的空間無法繼續(xù)處理第i個(gè)請(qǐng)求
{
returnfalse;
}
else
//剩余的空間能繼續(xù)處理第i個(gè)請(qǐng)求,處理完成后將占用O[i]個(gè)空間
{
$left-=$O[$i];
}
}
returntrue;
}
$R=[10,15,23,20,6,9,7,16];
$O=[2,7,8,4,5,8,6,8];
$N=8;
$M=50;
$i;
$schedueResult=schedule($R,$O,$N,$M);
if($schedueResult)
{
printf("按照如下請(qǐng)求序列可以完成:\n");
for($i=0;$i<$N;$i++)
{
printf("{%d,%d}",$R[$i],$O[$i]);
}
}
else
{
printf("無法完成調(diào)度\n");
}
?>
程序的運(yùn)行結(jié)果為
按照如下請(qǐng)求序列可以完成:{20,4}{23,8}{10,2}{15,7}{16,8}{6,5}{9,8}{7,6}
算法性能分析:這個(gè)算法的時(shí)間復(fù)雜度為O(N^2)。
22、方法1:
functiongetExt($url){
$arr=parse_url($url);
$file=basename($arr['path']);
$ext=explode(".",$file);
return$ext[1];
}
方法2:
functiongetExt($url){
$url=basename($url);
$pos1=strpos($url,".");
$pos2=strpos($url,"?");
if(strstr($url,"?”)){
returnsubstr($url,$pos1+1,$pos2-$pos1-1);
}else{
returnsubstr($url;$pos1);
}
}
23、最容易想到的辦法是申請(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)過分析后,很容易得到該問題的遞歸定義和遞歸終止條件。遞歸定義:將當(dāng)前棧的最底元素移到棧頂,其他元素順次下移一位,然后對(duì)不包含棧頂元素的子棧進(jìn)行同樣的操作。終止條件:遞歸下去,直到棧為空。遞歸的調(diào)用過程如下圖所示。
在上圖中,對(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();
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 撫順職業(yè)技術(shù)學(xué)院《英語(yǔ)交際2》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海工程技術(shù)大學(xué)《環(huán)境模型設(shè)計(jì)與制作》2023-2024學(xué)年第二學(xué)期期末試卷
- 云南農(nóng)業(yè)職業(yè)技術(shù)學(xué)院《醫(yī)學(xué)影像讀片訓(xùn)練》2023-2024學(xué)年第二學(xué)期期末試卷
- 哈爾濱科學(xué)技術(shù)職業(yè)學(xué)院《路基路面工程》2023-2024學(xué)年第二學(xué)期期末試卷
- 大連藝術(shù)學(xué)院《綜合大學(xué)英語(yǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 臺(tái)州職業(yè)技術(shù)學(xué)院《中西醫(yī)結(jié)合急診醫(yī)學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 福建幼兒師范高等??茖W(xué)校《中國(guó)現(xiàn)代文學(xué)流派與思潮》2023-2024學(xué)年第二學(xué)期期末試卷
- 中山紅磚隔墻施工方案
- 高架柱子灌漿施工方案
- 玻鎂風(fēng)管施工方案
- 高家堡副井井筒壁座施工安全技術(shù)措施
- 世界貿(mào)易組織(WTO課件(25頁(yè)P(yáng)PT)
- 《民航貨物運(yùn)輸》課程標(biāo)準(zhǔn)
- 雙胎妊娠 PPT課件
- 脊髓壓迫癥A吳紹勇
- FMEA第五版表格(實(shí)例)
- 國(guó)標(biāo)-》桉樹無性系組培快繁技術(shù)規(guī)程
- 2002工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)
- 百斯巴特扒胎機(jī)MS63
- 液晶顯示器的原理和制造.ppt
- 2015年工資調(diào)整標(biāo)準(zhǔn)對(duì)照表(崗位工資、薪級(jí)工資、績(jī)效工資)
評(píng)論
0/150
提交評(píng)論