版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
某知名視頻網(wǎng)站服務(wù)商PHP工程師面試筆試真題及答案一、選擇題1、假如何老師看到擺鐘的時(shí)間是17:32,那么此時(shí)時(shí)針與分針的最小夾角是______
A.25°
B.26°
C.28°
D.32°
2、執(zhí)行如下代碼,結(jié)果是______
<?php
$a=-3;
$b=4;
echo$a|$b;
?>
A.-3
B.4
C.-7
D.1
3、如何給變量$a、$b和$c賦值才能使以下程序顯示字符串“hello,World!”?______
<?php
$a=?;
$b=?;
$c=?;
if($a){
if($b&&!$c){
echo"GoodbyeCruelWbrld!";
}elseif(!$b&&!$c){
echo"Nothinghere";
}
}else{
if(!$b){
if(!$a&&(!$b&&$c)){
echo"hello,World!";
}else{
echo"GoodbyeWorld!";
}
}else{
echo"Notquite.";
}
}
?>
A.false,true,false
B.true,true,false
C.false,true,trueD.false,false,true
4、以下程序的運(yùn)行結(jié)果是______
functionsort_my_array($array){
returnsort($array);
}
$al=array(3,2,1);
var_dump(sort_my_array(&$a1));
A.NULL
B.0=>1,1=>2,2=>3
C.一個(gè)引用錯(cuò)誤
D.2=>1,1=>2,0=>3
E.bool(true)
5、考慮如下腳本,標(biāo)記處應(yīng)該添加什么代碼才能讓腳本輸出字符串php?______
<?php
$alpha='abcdefghijklmnopqrstuvwxyz';
$letters=array(15,7,15);
foreach($lettersas$val){
/*這里應(yīng)該加入什么*/
}
?>
A.echochr($val);
B.echoasc($val);
C.echosubstr($alpha,$val,2);
D.echo$alpha[$val];
E.echo$alpha[$val+1]
6、以下程序的運(yùn)行結(jié)果是______
<?php
classa{
functiona(){
echo'parentcalled';
}
}
classb{
functionb(){
}
}
$c=newb();
?>
A.parentcalled
B.一個(gè)錯(cuò)誤
C.一個(gè)警告
D.什么都沒有
7、setcookie("vipname","tom",time()+1000);以下有關(guān)上述代碼的描述中,錯(cuò)誤的是______
A.該代碼設(shè)置了一個(gè)變量名為vipname的Cookie
B.該代碼設(shè)置了一個(gè)變量值為tom的Cookie
C.該變量的存活期限為1000s
D.該變量的存活期限為1s
8、以下是一個(gè)類的聲明,對成員屬性正確的賦值方式是______
<?php
classTest{
private$a;
static$b;
functionsetA($a){
$this->a=$a;
}
}
$test=newtest();
?>
A.$test->a="abc";
B.Test::$b="abc";
C.Test::setA("abc");
D.$test->b="abc";
9、運(yùn)算符“^”的作用是______
A.無效
B.乘方
C.位非
D.位異或
10、在忽略瀏覽器bug的正常情況下,如何用一個(gè)與先前設(shè)置的域名(domain)來訪問新域名中的某個(gè)Cookie?______
A.通過HTTPREMOTECOOKIE訪問
B.不可能
C.在調(diào)用setcookie()時(shí)設(shè)置一個(gè)不同的域名
D.向?yàn)g覽器發(fā)送額外的請求
E.使用Javascript,把Cookie包含在URL中發(fā)送
二、填空題11、Cookie的值存儲在______。
12、______函數(shù)能讓服務(wù)器輸出header:set-Cookie:foo=bar。
13、讓類中的某些方法無法在類的外部或繼承訪問的方法是______。
14、如果在PHP中使用Oracle數(shù)據(jù)庫作為數(shù)據(jù)庫服務(wù)器,那么應(yīng)該在PDO中加載______驅(qū)動(dòng)程序。
15、POST和GET傳輸?shù)淖畲笕萘糠謩e是______和______。
三、簡答題16、sort()函數(shù)、asort()函數(shù)和ksort()函數(shù)有什么區(qū)別?它們分別在什么情況下使用?
17、談?wù)勀銓ookie與Session的理解,它們的適用場景是什么?
18、如何設(shè)計(jì)或配置MySQL,才能達(dá)到高效使用的目的?
19、如果頁面字符出現(xiàn)亂碼,那么該怎么解決?
20、與數(shù)組相關(guān)的常用函數(shù)有哪些?
四、編程題21、寫一個(gè)PHP函數(shù)實(shí)現(xiàn)對array(12,34,9,68,26,95,6,118)的從小到大排序。
22、請寫出將兩個(gè)數(shù)組連接成一個(gè)新數(shù)組的兩種方法。
23、請編寫函數(shù)計(jì)算出兩個(gè)日期之間的天數(shù)。
24、所謂中位數(shù)就是一組數(shù)據(jù)從小到大排列后中間的那個(gè)數(shù)字。如果數(shù)組長度為偶數(shù),那么中位數(shù)的值就是中間兩個(gè)數(shù)字相加除以2,如果數(shù)組長度為奇數(shù),那么中位數(shù)的值就是中間那個(gè)數(shù)字。
答案:
一、選擇題
1、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。2、A[解析]$a和$b通過按位或運(yùn)算(|)運(yùn)算時(shí)會把$a和$b分別進(jìn)行二進(jìn)制運(yùn)算,然后把$a或$b中為1的位設(shè)為1。$a為-3,它的二進(jìn)制為正數(shù)3的補(bǔ)碼即1100,而$b=4,二進(jìn)制數(shù)為0100,所以,$a|$b等價(jià)于(1100)|(0100),它們二進(jìn)制中為1的位數(shù)都設(shè)為1,得到1100,即-3,輸出得到-3。選項(xiàng)A正確。
所以,本題的答案為A。3、D[解析]
因?yàn)椤癶ello,World!”在if($a)的else語句里面,所以$a需要為false才能執(zhí)行else語句里面的內(nèi)容。在else中,由于“hello,World!”在if(!Sb)條件里面,說明!$b需要為真,而$b前面有個(gè)非運(yùn)算符,說明$b為false。而“hello,World!”在if(!$a
&&(!$b&&$c))中,說明條件!$a&&(!$b
&&$c)應(yīng)該為真,“&&”運(yùn)算符要求必須每個(gè)條件都為true才返回true,所以,代入$a=$b=false,可以得到$c為true。選項(xiàng)D正確。
所以,本題的答案為D。4、C[解析]
通過sort_my_array(&$a1)將數(shù)組$a1的引用傳遞到sort_my_array()函數(shù)中排序,這種寫法在PHP5.3版本及以前是支持這樣的格式的,sort()函數(shù)排序成功會返回true,失敗會返回false。而returnsort($array)返回的是排序后的結(jié)果值true,所以var_dump()打印后得到的是bool(true)。但是PHP5.3以后的版本已經(jīng)廢除這樣的寫法,如果在PHP5.3以后的版本中使用這種方法,那么將會報(bào)致命錯(cuò)誤。因此,不建議再使用這種方式值的引用。選項(xiàng)C正確。
所以,本題的答案為C。5、D[解析]
對于選項(xiàng)A,chr()函數(shù)可以從指定的ASCII值中返回對應(yīng)的字符串。而PHP字符串對應(yīng)的ASCII碼并不是15,7,15。選項(xiàng)A錯(cuò)誤。
對于選項(xiàng)B,PHP中不存在asc()函數(shù)。選項(xiàng)B錯(cuò)誤。
對于選項(xiàng)C,substr()函數(shù)可以返回字符串的一部分,substr($alpha,$val,2)的意思是,在$alpha字符串的$val位置中取2個(gè)字符串,最后取出來的值是pqhipq不是php。選項(xiàng)C錯(cuò)誤。
對于選項(xiàng)D,因?yàn)镻HP是弱類型語言,可以把字符串看成數(shù)組進(jìn)行取值,剛好15對應(yīng)$alpha中的p,7對應(yīng)h,所以最終可以輸出php。選項(xiàng)D正確,選項(xiàng)E錯(cuò)誤。
所以,本題的答案為D。6、D[解析]
因?yàn)轭惷秃瘮?shù)名都為b,所以函數(shù)b等價(jià)于構(gòu)造函數(shù),當(dāng)實(shí)例化b時(shí),執(zhí)行函數(shù)b,因?yàn)楹瘮?shù)b的函數(shù)體為空,所以最后結(jié)果什么都沒有。選項(xiàng)D正確。
所以,本題的答案為D。7、D[解析]setcookie()的語法為setcookie(變量名,變量值,有效期),對應(yīng)的是變量名為vipname,變量值為tom,有效期的單位為s,所以為當(dāng)前時(shí)間加上1000s而不是1s。選項(xiàng)D正確。
所以,本題的答案為D。8、B[解析]
對于選項(xiàng)A,因?yàn)?a是私有方法,所以不能在外部執(zhí)行賦值操作。選項(xiàng)A錯(cuò)誤。
對于選項(xiàng)B,要對類中的靜態(tài)常量賦值可以使用“類名::變量”的形式賦值,可以對成員屬性$b賦值。選項(xiàng)B正確。
對于選項(xiàng)C,因?yàn)閟etA()函數(shù)不是一個(gè)靜態(tài)函數(shù),所以不能使用Test::setA()的格式在類外調(diào)用函數(shù),可以使$test->setA("abc")的方式調(diào)用函數(shù)。選項(xiàng)C錯(cuò)誤。
對于選項(xiàng)D,因?yàn)?b是靜態(tài)變量,所以不能使用$this->b方式賦值,賦值方式應(yīng)該為Test::$b="abc"。選項(xiàng)D錯(cuò)誤。
所以,本題的答案為B。9、D[解析]PHP中的“^’表示位異或運(yùn)算符。選項(xiàng)D正確。
所以,本題的答案為D。10、B[解析]domain表示的是Cookie所在的域,默認(rèn)為請求的地址,如網(wǎng)址為/index.php/index/hello,那么domain默認(rèn)為。對于Cookie的跨域名訪問只支持同域名下的多級域名訪問,如域A為,域B為,那么域名A和域名B共同訪問域名A或域名B生成的Cookie,它們的domain都要設(shè)置為.才行。而如果要在域A中生成一個(gè)域名B不能訪問的Cookie,那么只需要將Cookie的domain設(shè)置為。
如果先前設(shè)置了一個(gè)域名domain,讓新域名訪問,那么會存在新域名不在domain的范圍內(nèi),domain的Cookie不能被新域名訪問。選項(xiàng)B正確。
所以,本題的答案為B。二、填空題11、客戶端。12、setcookie()或setrawCookie()。[解析]
由這個(gè)header頭里面的信息set-Cookie知道是對Cookie進(jìn)行設(shè)置,所以可以通過setcookie()或setrawCookie()函數(shù)輸出HTTP發(fā)送Cookie的信息。13、private。14、PDO_OCI。[解析]PDO_OCIisadriverthatimplementsthePHPDataObjects(PDO)interfacetoenableaccessfromPHPtoOracledatabasesthroughtheOCIlibrary。15、POST默認(rèn)是2MB,php.ini可設(shè)置,GET是1KB。[解析]GET是通過URL提交數(shù)據(jù)的,因此,GET可提交的數(shù)據(jù)量就跟URL所能達(dá)到的最大長度有直接關(guān)系。URL不存在參數(shù)上限的問題,HTTP協(xié)議規(guī)范也沒有對URL長度進(jìn)行限制。IE對URL長度的限制是2083B(2KB+35B)。對于其他瀏覽器,例如,F(xiàn)ireFox、Netscape等,則沒有長度限制,這個(gè)時(shí)候其限制取決于服務(wù)器的操作系統(tǒng)。即如果url太長,那么服務(wù)器可能會因?yàn)榘踩矫娴脑O(shè)置從而拒絕請求或者發(fā)生不完整的數(shù)據(jù)請求。
理論上講,POST是沒有大小限制的,HTTP協(xié)議規(guī)范也沒有進(jìn)行大小限制,但實(shí)際上,POST所能傳遞的數(shù)據(jù)量大小取決于服務(wù)器的設(shè)置和內(nèi)存大小。對于PHP語言而言,上傳文件涉及的參數(shù)PHP默認(rèn)的上傳上限為2MB,更改這個(gè)值需要更改php.conf的post_max_size這個(gè)值。三、簡答題16、sort()函數(shù)對索引數(shù)組的鍵值進(jìn)行升序排序并且不保留鍵名,鍵值為字母時(shí)按26字母的順序進(jìn)行排序。
asort()函數(shù)對關(guān)聯(lián)數(shù)組的鍵值進(jìn)行升序排序并且保留鍵名,鍵值為數(shù)字時(shí)按升序進(jìn)行排序。
ksort()函數(shù)對關(guān)聯(lián)數(shù)組按照鍵名進(jìn)行升序排序并且保留鍵名,對一個(gè)數(shù)組排序使用。ksort()函數(shù)時(shí),關(guān)聯(lián)數(shù)組的鍵名主要按照26個(gè)字母的順序進(jìn)行升序排序。
它們的使用情況為,如果對索引數(shù)組進(jìn)行升序排序,不考慮保留原數(shù)組順序鍵名時(shí),那么可以使用sort()函數(shù)進(jìn)行排序。如果是對關(guān)聯(lián)數(shù)組進(jìn)行升序排序,需要按鍵值進(jìn)行升序排序,那么可以使用asort()函數(shù),如果需要按鍵名進(jìn)行升序排序,那么可以使用ksort()函數(shù)。
17、Cookie和Session都是用來解決HTTP無狀態(tài)協(xié)議存在的問題而產(chǎn)生的,為了保證從一個(gè)網(wǎng)頁到另一個(gè)網(wǎng)頁跳轉(zhuǎn)時(shí)可以知道是同一個(gè)用戶進(jìn)行操作。網(wǎng)站可以通過Cookie或Session識別用戶并給予相關(guān)的權(quán)限和顯示內(nèi)容。Cookie主要存儲在客戶端,大小不能超過4KB,安全性沒有Session高。Session主要存儲在服務(wù)端,存儲大小沒有限制且可以存儲比較復(fù)雜的數(shù)據(jù)類型,由于數(shù)據(jù)存儲在服務(wù)器端,因此安全性較高。但是Session依賴于Cookie存儲SessionID,所以如果禁用了Cookie,那么Session沒有辦法正常工作。
它們的適用場景有:
1)用戶登錄時(shí)記住用戶信息和用戶登錄狀態(tài),鎖定用戶給予相關(guān)的信息顯示和權(quán)限。
2)購物車中的商品歸屬,可以鎖定商品信息歸屬對應(yīng)的客戶。
18、1)數(shù)據(jù)庫設(shè)計(jì)方面,設(shè)計(jì)結(jié)構(gòu)良好的數(shù)據(jù)庫,允許部分?jǐn)?shù)據(jù)冗余。
2)選取最適用的字段屬性,盡可能把字段設(shè)置為NOTNULL,這樣在查詢的時(shí)候,數(shù)據(jù)庫不用去比較NULL值。
3)系統(tǒng)架構(gòu)設(shè)計(jì)方面,進(jìn)行表散列,把海量數(shù)據(jù)散列到幾個(gè)不同的表里面,進(jìn)行集群,數(shù)據(jù)庫查詢和寫入分開。
4)編寫高效SQL語句,以提高效率。
5)使用連接(JOIN)來代替子查詢。
6)使用聯(lián)合(UNION)來代替手動(dòng)創(chuàng)建的臨時(shí)表。
7)必要的時(shí)候用不同的存儲引擎,比如InnoDB可以減少死鎖,HEAP可以提高一個(gè)數(shù)量級的查詢速度。
8)合理使用事務(wù)、外鍵和索引。
19、1)首先查看當(dāng)前文件是否設(shè)置了字符集。如果是HTML頁面,那么查看meta標(biāo)簽中是否存在charset設(shè)置文件字符集,如果是PHP頁面,那么可以查看是否在header()函數(shù)中指定了charset設(shè)置文件字符集。
例如,header("content-type:text/html;charset=utf-8");,可以通過該函數(shù)設(shè)置網(wǎng)站編碼。
2)如果通過方法1)發(fā)現(xiàn)已經(jīng)設(shè)置了字符集,那么接下來需要判斷當(dāng)前文件保存的編碼格式是否與頁面設(shè)置的字符集保持一致,如果不一致,那么需要修改保證兩者字符集統(tǒng)一。
3)如果是從數(shù)據(jù)庫取數(shù)據(jù)出現(xiàn)的亂碼,那么需要查看數(shù)據(jù)庫查詢時(shí)設(shè)置的字符集與當(dāng)前頁面設(shè)置的字符集是否一致,并保證兩者字符集統(tǒng)一。對數(shù)據(jù)庫取值設(shè)置編碼的方法為mysql_query("setnamesutf8")。
20、與數(shù)組相關(guān)的常用函數(shù)主要有以下幾個(gè):
1)count()函數(shù),用于計(jì)算數(shù)組中的元素?cái)?shù)量,sizeof()函數(shù)是count()函數(shù)的別名。
2)sort()函數(shù),用于數(shù)組對鍵值進(jìn)行升序排序。
3)in_array()函數(shù),用于檢查數(shù)組中是否存在某個(gè)鍵值。
4)explode()函數(shù)和implode()函數(shù),用于數(shù)組與字符串相互轉(zhuǎn)換。
explode()函數(shù),通過使用一個(gè)分隔符對字符串進(jìn)行切割,返回一個(gè)數(shù)組。例如,通過逗號對字符串進(jìn)行分割成數(shù)組:$arr=implode(",",$String)。
implode()函數(shù),通過設(shè)定一個(gè)連接符,將數(shù)組中的每個(gè)元素連接為一個(gè)字符串。例如,通過逗號對每個(gè)鍵值進(jìn)行分隔拼接成字符串:implode(",","$array")。
5)array_merge()函數(shù),可以將一個(gè)或多個(gè)數(shù)組的元素合并成一個(gè)數(shù)組,一個(gè)數(shù)組的值附加在前一個(gè)數(shù)組的后面,返回合并后的數(shù)組。但是需要注意,如果合并的數(shù)組中存在相同的字符串鍵名,那么后一個(gè)數(shù)組的鍵值會覆蓋前一個(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ù)組的開頭插入新元素。
9)array_push()函數(shù),用于向數(shù)組的尾部插入一個(gè)或多個(gè)元素(入棧),然后返回?cái)?shù)組的長度。
10)array_pop()函數(shù),用于刪除數(shù)組中的最后一個(gè)元素(出棧)。
11)array_reverse()函數(shù),用于把數(shù)組的鍵值反向排序并返回?cái)?shù)組。四、編程題21、可以使用快速排序的算法對數(shù)組進(jìn)行從小到大的排序。
實(shí)現(xiàn)代碼如下:
<?php
$arr=array(12,34,9,68,26,95,6,118);
functionquick_sort($arr){
$length=count($arr);
if($length<=1){
return$arr;
$base_num=$arr[0];
$left=array();
$right=array();
for($i=1;$i<$length;$i++){
if($base_num>$arr[$i]){
$left[]=$arr[$i];
}else{
$right[]=$arr[$i];
}
}
$left=quick_sort($left);
$right=quick_sort($right);
returnarray_merge($left,array($base_num),$right);
}
$newArr=quick_sort($arr);
print_r($newArr);
}
?>
程序的運(yùn)行結(jié)果為
Array([0]=>6[1]=>9[2]=>12[3]=>26[4]=>34[5]=>68[6]=>95[7]=>118)
快速排序的時(shí)間復(fù)雜度最佳情況:T(n)=O(nlogn),最差情況:T(n)=O(n2),平均情況:T(n)=O(nlogn)。
22、把兩個(gè)數(shù)組合并有以下幾種方法。
1)使用array_merge()函數(shù)。
array__merge()函數(shù)可以把一個(gè)或多個(gè)數(shù)組合并為一個(gè)數(shù)組,語法為array_merge($array1,$array2.......)。
實(shí)現(xiàn)代碼如下:
<?php
$arr1=array(1,2,3,"b"=>"a");
$arr2=array(3,4,5,"b"=>"c");
$arr=array_merge_recursive($arr1,$arr2);
print_r($arr);
?>
程序的運(yùn)行結(jié)果為Array([0]=>1[1]=>2[2]=>3[b]=>c[3]=>3[4]=>4[5]=>5)。
2)使用array_merge_recursive()函數(shù)合并。
array_merge_recursive()函數(shù)可以把一個(gè)或多個(gè)數(shù)組合并為一個(gè)數(shù)組,使用方法以及作用和array_merge()函數(shù)一樣。但是在使用array_merge()合并的數(shù)組時(shí),如果存在相同的字符串鍵名,那么后一個(gè)數(shù)組會覆蓋前一個(gè)數(shù)組的鍵值。而使用array_merge_recursive()時(shí),如果存在相同的字符串鍵名,那么在相同鍵名下會合并成一個(gè)新的數(shù)組。
實(shí)現(xiàn)代碼如下:
<?php
$arr1=array(1,2,3,"b"=>"a");
$arr2=array(3,4,5,"b"=>"c");
$arr=array_merge_recursive($arr1,$arr2);
print_r($arr);
?>
程序的運(yùn)行結(jié)果為
Array([0]=>1[1]=>2[2]=>3[b]=>Array([0]=>a[1]=>c)[3]=>3[4]=>4[5]=>5)
3)創(chuàng)建一個(gè)新的數(shù)組,把數(shù)組一和數(shù)組二壓入新數(shù)組中。
可以通過創(chuàng)建一個(gè)新的數(shù)組,對合并的數(shù)組進(jìn)行遍歷依次壓入新數(shù)組中,從而合并數(shù)組。
實(shí)現(xiàn)代碼如下:
<?php
$arr1=array(1,2,3,"b"=>"a");
$arr2=array(3,4,5,"b"=>"c");
$array=array();
foreach($arr1as$k=>$val){
$array[]=$val;
}
foreach($arr2as$k=>$val){
$array[]=$val;
}
print_r($array);
?>
程序的運(yùn)行結(jié)果為Array([0]=>1[1]=>2[2]=>3[3]=>a[4]=>3[5]=>4[6]=>5[7]=>c)。
以上的三種方法中,方法一和方法二使用的是PHP自帶的函數(shù),方法三中需要根據(jù)兩個(gè)數(shù)組的長度依次循環(huán)多次壓入新數(shù)組中,方法一、方法二的執(zhí)行速度比方法三快。
23、可以首先把兩個(gè)日期轉(zhuǎn)換為時(shí)間戳,求出兩個(gè)時(shí)間戳的差值,接著用這個(gè)差值除以一天的秒數(shù)得到天數(shù)的差值,最后通過floor()函數(shù)對計(jì)算結(jié)果向下取整得到天數(shù)。
實(shí)現(xiàn)代碼如下:
<?php
functionbetweenDay($day1,$day2){
$day1=strtotime($day1);
$day2=strtotime($day2);
if($day1<$day2){
$dif=$day2-$day1;
$result=$dif/(24*3600);
}else{
$result=($day1-$day2)/(24*3600);
}
returnfloor($result);
}
echobetweenDay("2017-9-5","2017-9-3");
?>
程序的運(yùn)行結(jié)果為2。
24、根據(jù)定義,如果數(shù)組是一個(gè)已經(jīng)排序好的數(shù)組,那么直接通過索引即可獲取到所需的中位數(shù)。如果題目允許排序,那么本題的關(guān)鍵在于選取一個(gè)合適的排序算法對數(shù)組進(jìn)行排序。一般而言,快速排序的平均時(shí)間復(fù)雜度較低,為O(nlog2n),所以,如果采用排序方法,算法的平均時(shí)間復(fù)雜度為O(nlog2n)。
可是,題目要求不許使用排序算法。那么前一種方法是不可取的。此時(shí),可以換一種思維,使用分治的思想。快速排序算法在每一次局部遞歸后都保證某個(gè)元素左側(cè)的元素的值都比它小,右側(cè)的元素的值都比它大,因此,可以利用這個(gè)思路快速地找到第N大元素,而與快速排序算法不同的是,這個(gè)算法關(guān)注的并不是元素的左右兩邊,而僅僅是某一邊。
根據(jù)快速排序的方法,可以采用一種類似快速排序的方法,找出這個(gè)中位數(shù)來。具體而言,首先把問題轉(zhuǎn)化為求一列數(shù)中第i小的數(shù)的問題,求中位數(shù)就是求一列數(shù)的第(length/2+1)小的數(shù)的問題(其中l(wèi)ength表示的是數(shù)組序列的長度)。
當(dāng)使用一次類快速排序算法后,分割元素的下標(biāo)為pos:
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度精密產(chǎn)品模具設(shè)計(jì)與委托加工服務(wù)合同4篇
- 2025年休閑公園場地租賃合同印花稅繳納規(guī)范2篇
- 專業(yè)發(fā)藝師2024服務(wù)協(xié)議樣本版A版
- 2025年度智慧農(nóng)業(yè)園區(qū)場商位租賃與農(nóng)產(chǎn)品上行合同4篇
- 專用消防系統(tǒng)增補(bǔ)協(xié)議樣本2024版A版
- 2025年度多功能鏟車租賃服務(wù)合同范本4篇
- 2025年度文化創(chuàng)意產(chǎn)業(yè)合作開發(fā)合同7篇
- 2025年度可打印PAD與智能教室系統(tǒng)配套合同3篇
- 2024蔬菜種植合作社與社區(qū)團(tuán)購平臺合作協(xié)議范本3篇
- 2025年度拆伙協(xié)議書范本下載4篇
- 2024年職工普法教育宣講培訓(xùn)課件
- 金蛇納瑞企業(yè)2025年會慶典
- 安保服務(wù)評分標(biāo)準(zhǔn)
- T-SDLPA 0001-2024 研究型病房建設(shè)和配置標(biāo)準(zhǔn)
- (人教PEP2024版)英語一年級上冊Unit 1 教學(xué)課件(新教材)
- 全國職業(yè)院校技能大賽高職組(市政管線(道)數(shù)字化施工賽項(xiàng))考試題庫(含答案)
- 2024胃腸間質(zhì)瘤(GIST)診療指南更新解讀 2
- 光儲電站儲能系統(tǒng)調(diào)試方案
- 2024年二級建造師繼續(xù)教育題庫及答案(500題)
- 小學(xué)數(shù)學(xué)二年級100以內(nèi)連加連減口算題
- 建設(shè)單位如何做好項(xiàng)目管理
評論
0/150
提交評論