版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
某知名手機(jī)制造商PHP工程師面試筆試真題19一、選擇題1.
以下關(guān)于設(shè)計(jì)模式的說法中,錯(cuò)誤的是______A.觀察者模式中,觀察者可以改變被觀察者的狀態(tài),再由被觀察者通知所有觀察者依據(jù)被觀察者的狀態(tài)進(jìn)行(江南博哥)B.MVC模型的基本工作原理是基于觀察者模式,實(shí)現(xiàn)是基于命令模式C.設(shè)計(jì)模式的核心原則是“開.閉”原則,即對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉D.創(chuàng)立型模式的根本意圖是要把對(duì)象的創(chuàng)建和使用分離的責(zé)任進(jìn)行分離,從而降低系統(tǒng)的耦合度正確答案:A[解析]觀察者只能觀察到被觀察者狀態(tài)的變化,而不能改變被觀察者的狀態(tài)。
所以,本題的答案為A。
2.
有如下代碼:
$String="Thisisatest.";
echoereg_replace("is"."was",$String)."<br>";
echoereg_replace("()is","\\1was",$String)."<br>";
echoereg_replace("(()is)","\\2was",$String)."<br>";
程序的輸出結(jié)果為______A.Thiswasatest.Thisisatest.Thiswasatest.B.Thisisatest.Thisisatest.Thiswasatest.C.Thisisatest.Thisisatest.Thisisatest.D.Thiswasatest.Thisisatest.Thisisatest.E.Thiswasatest.Thiswasatest.Thiswasatest.正確答案:E[解析]ereg_replace()函數(shù)可以對(duì)符合正則條件的字符串替換,因?yàn)榈谝粋€(gè)是將is替換成was,所以,選項(xiàng)B選項(xiàng)C錯(cuò)誤。第二句匹配的是“()is”規(guī)則,“()”表示的是匹配符合規(guī)則的字符串,而“\\1”表示的是和子匹配一樣的內(nèi)容,那么會(huì)被替換成“Thiswasatest.”第三個(gè)輸出中,“(()is)”匹配符合括號(hào)內(nèi)規(guī)則的字符串,“\\2was”表示和第二個(gè)子匹配()is的內(nèi)容一樣,會(huì)替換輸出為Thiswasatest.。選項(xiàng)E正確。
所以,本題的答案為E。
3.
在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。
4.
某些時(shí)候需要在PHP腳本中使用第三方功能,來(lái)實(shí)現(xiàn)一些PHP不能完成的任務(wù)(比如調(diào)用壓縮軟件壓縮某種PHP不支持其格式的文件)。當(dāng)在PHP腳本中執(zhí)行系統(tǒng)命令時(shí),以下選項(xiàng)中,能確保沒有命令注入的是______(雙選)A.總是要給在exec()中執(zhí)行的命令加'B.總是使用shell_exec()函數(shù),它能夠在執(zhí)行前對(duì)命令進(jìn)行安全檢查C.使用escapeshellcmd()數(shù)轉(zhuǎn)義命令中的特殊字符D.在執(zhí)行命令前,先用ini_set()打開safe_modeE.用escapeshellarg()數(shù)在執(zhí)行前轉(zhuǎn)義命令參數(shù)正確答案:CE[解析]在PHP中執(zhí)行變量參與的系統(tǒng)命令時(shí),是沒有辦法保證任何一個(gè)函數(shù)是絕對(duì)安全的,可以使用escapeshellcmd()函數(shù)和escapeshellarg()函數(shù)轉(zhuǎn)義命令中的特殊字符或命令參數(shù),再傳遞給shell,這樣可以保證字符和命令參數(shù)的安全。選項(xiàng)C選項(xiàng)E正確。
所以,本題的答案為CE。
5.
以下程序的輸出結(jié)果是______
<?php
$x='apple';
echosubstr_replace($x,'x',1,2);
?>A.xB.axleC.axxleD.applexE.Xapple正確答案:B[解析]substr_replace()函數(shù)用于把字符串的一部分替換為另一部分,語(yǔ)法為substr_replace(檢查的字符串,需要插入的字符串,何處開始替換(可選),替換多少個(gè)字符(可選))。所以substr_replace($x,'x',1,2)的意思是,從索引位置等于1的$x字符串位置開始,把$x中的2個(gè)字符串替換為一個(gè)字符串x,可以得到axle。選項(xiàng)B正確。
所以,本題的答案為B。
6.
安裝Web服務(wù)器程序后,在地址欄中輸入______,可以訪問站點(diǎn)默認(rèn)文檔。A.在局域網(wǎng)中直接輸入服務(wù)器的IP地址B.在局域網(wǎng)中直接輸入服務(wù)器所在計(jì)算機(jī)的名稱C.如果是在服務(wù)器所在的計(jì)算機(jī)上,那么直接輸入D.以上全都是對(duì)的正確答案:D[解析]要訪問到服務(wù)器的程序,可以根據(jù)服務(wù)器的IP地址直接訪問,也可以通過服務(wù)器的計(jì)算機(jī)名稱進(jìn)行遠(yuǎn)程訪問,或者直接在服務(wù)器的計(jì)算機(jī)中輸入也可以訪問,因?yàn)槭潜镜胤?wù)器的路徑。選項(xiàng)A選項(xiàng)B選項(xiàng)C的描述都是對(duì)的,故選項(xiàng)D正確。
所以,本題的答案為D。
7.
假設(shè)需要編寫一個(gè)腳本,用來(lái)通過任意一個(gè)流讀取文本數(shù)據(jù),并用另一個(gè)ROT13編碼的流寫回。編碼必須在用第二個(gè)流寫回時(shí)進(jìn)行。以下最合適的方法是______A.把編碼后的數(shù)據(jù)存在臨時(shí)變量中,把這個(gè)變量寫入流B.用流過濾器即時(shí)編碼C.創(chuàng)建一個(gè)ROT13查詢表,然后一個(gè)字符一個(gè)字符地即時(shí)寫入D.ROT13無(wú)法即時(shí)編碼E.以上都不對(duì)正確答案:B[解析]PHP中的流過濾器可以應(yīng)用在任何流上,并且能對(duì)數(shù)據(jù)流同時(shí)進(jìn)行多個(gè)操作??梢越o一個(gè)流同時(shí)添加ROT13過濾器和base64過濾器,來(lái)合并成base64/ROT13編碼。選項(xiàng)B正確。
所以,本題的答案為B。
8.
gethostbynamel函數(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。
9.
寬帶的1Mbit/s理論上的下載速度是______A.128kbit/sB.256kbit/sC.1024kbit/sD.512kbit/s正確答案:A[解析]因?yàn)橄螺d速度是以Byte做單位,1B=8bit,所以1Mbit/s的理論上下載速度是1Mbit/s=1024kbit/s。所以可得1*1024/8bit/s=128kbit/s。
所以,本題的答案為A。
10.
下列代碼的輸出結(jié)果是______
<?php
$qpt='Eattolive,butnotlivetoeat';
echopreg_match("/∧to/",$qpt);
?>A.0B.1C.toD.Null正確答案:A[解析]preg_match()函數(shù)主要用于正則表達(dá)式的匹配,如果匹配成功,則返回1,如果匹配失敗,則返回0。
需要注意的是,只要preg_match()匹配成功一次后就會(huì)停止匹配,如果想要實(shí)現(xiàn)全部結(jié)果的匹配,則需使用preg_match_all()函數(shù)來(lái)實(shí)現(xiàn)。
對(duì)于本題而言,正則表達(dá)式“/^to/”,最前面的/和最后面的/表示正則表達(dá)式的開始和結(jié)束?!癪to”表示這個(gè)正則表達(dá)式只能匹配以“to”開頭的字符串。由于題目中的字符串不是以to開頭的,因此匹配失敗。選項(xiàng)A正確。
所以,本題的答案為A。
二、填空題1.
______函數(shù)能返回腳本里任意行中調(diào)用的函數(shù)的名稱。該函數(shù)同時(shí)還經(jīng)常被用在調(diào)試中,用來(lái)判斷錯(cuò)誤是如何發(fā)生的。正確答案:debug_backtrace()。[解析]debug_backtrace()的作用:返回在特定位置調(diào)用過的函數(shù)名組成的數(shù)組,經(jīng)常被用于調(diào)試。
2.
面向?qū)ο蟮闹饕卣饔衉_____、______、______、______。正確答案:抽象、繼承、封裝、多態(tài)。[解析]1)抽象:抽象就是忽略一個(gè)主題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時(shí)不用部分細(xì)節(jié)。抽象包括兩個(gè)方面,一是過程抽象,二是數(shù)據(jù)抽象。
2)繼承:繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵(lì)類的重用,它提供了一種明確表述共性的方法。對(duì)象的一個(gè)新類可以從現(xiàn)有的類中派生,這個(gè)過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實(shí)例變量,并且子類可以修改或增加新的方法使之更適合特殊的需要。
3)封裝:封裝是指將客觀事物抽象成類,每個(gè)類對(duì)自身的數(shù)據(jù)和方法實(shí)行保護(hù)。類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的信息進(jìn)行隱藏。
4)多態(tài):多態(tài)是指允許不同類的對(duì)象對(duì)同一消息做出響應(yīng)。多態(tài)包括參數(shù)化多態(tài)和包含多態(tài)。多態(tài)性語(yǔ)言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢(shì),很好地解決了應(yīng)用程序函數(shù)同名問題。
3.
打開php.ini中的safe_mode,會(huì)影響的函數(shù)有______、______、______、______、______、______。正確答案:fopen()、mkdir()、rmdir()、set_time_limit()、mysql_connect()、mail()。[解析]PHP的safa_mode提供了一個(gè)基本安全的共享環(huán)境,在一個(gè)有多個(gè)用戶賬戶存在的PHP開發(fā)的Web服務(wù)器上。當(dāng)安全模式打開的時(shí)候,部分函數(shù)將被完全地禁止,而還有部分函數(shù)的功能將會(huì)受到限制。下面重點(diǎn)給出其中的一部分:
1)fopen()、mkdir()、rmdir()檢查被操作的目錄是否與正在執(zhí)行的腳本有相同的UID。
2)創(chuàng)建新文件(只能在屬于當(dāng)前用戶的目錄下創(chuàng)建文件)。
3)dl()函數(shù)在安全模式下被禁用。
4)set_time_limit()在安全模式下不起作用。
5)mysql服務(wù)器所用的用戶名必須與調(diào)用mysql_connect()的文件的擁有者用戶名相同。
6)mail()在安全模式下,第5個(gè)參數(shù)被屏蔽。
4.
session的運(yùn)行機(jī)制是______。正確答案:服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息。[解析]Session是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息。
當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)Session的時(shí)候,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)Session標(biāo)識(shí)SessionID,如果已包含一個(gè)SessionID,則說明已經(jīng)為此客戶端創(chuàng)建Session,服務(wù)器就按照SessionID把這個(gè)Session檢索出來(lái)使用,如果客戶端請(qǐng)求不包含SessionID,那么為此客戶端創(chuàng)建一個(gè)Session并且生成一個(gè)與此Session相關(guān)聯(lián)的SessionID,SessionID的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè)SessionID將被在本次響應(yīng)中返回給客戶端保存。
5.
MySQL的事務(wù)是______。正確答案:事務(wù)是作為一個(gè)單元的一組有序的數(shù)據(jù)庫(kù)操作。如果組中的所有操作都成功,.則認(rèn)為事務(wù)成功,即使只有一個(gè)操作失敗,事務(wù)也不成功。如果所有操作完成,事務(wù)則提交,那么其修改將作用于所有其他數(shù)據(jù)庫(kù)進(jìn)程。如果一個(gè)操作失敗,則事務(wù)將回滾,該事務(wù)所有操作的影響都將取消。
三、簡(jiǎn)答題1.
mysql_fetch_row()和mysql_fetch_array()有什么區(qū)別?正確答案:mysql_fetch_row()把數(shù)據(jù)庫(kù)的一列存儲(chǔ)在一個(gè)以零為基數(shù)的陣列中,第一欄在陣列的索引0,第二欄在索引1,如此類推。mysql_fetch_assoc()把數(shù)據(jù)庫(kù)的一列存儲(chǔ)在一個(gè)關(guān)聯(lián)陣列中,陣列的索引就是欄位名稱,例如,數(shù)據(jù)庫(kù)查詢送回“first_name”“l(fā)ast_name”“email”三個(gè)欄位,陣列的索引便是“first_name”“l(fā)ast_name”和“email”。mysql_fetch_array()可以同時(shí)送回mysql_fetch_row()和mysql_fetch_assoc()的值。
2.
詳細(xì)描述PHP處理Web上傳文件的流程。如何限制上傳文件的大小不能超過某個(gè)數(shù)值?正確答案:首先用戶在瀏覽器端選擇上傳的文件,提交后,通過post方式上傳到Apache服務(wù)器由PHP引擎處理,判斷文件是否能夠上傳到PHP配置文件中指定的臨時(shí)目錄,之后獲取文件后綴名判斷文件是否是允許上傳的文件格式,沒有問題后再通過$_FILES["file"]["size"]得到上傳文件的數(shù)值大小,判斷其是否小于設(shè)置的值,如果沒問題,則按照隨機(jī)數(shù)+時(shí)間的方式生成文件的名字+后綴。最后將文件從臨時(shí)目錄轉(zhuǎn)移至Apache服務(wù)器目錄。
也可以在PHP配置文件通過file_upload_max設(shè)置其值限制上傳文件大小。
3.
Memcache對(duì)item的過期時(shí)間有什么限制?正確答案:Memcache的item過期時(shí)間最長(zhǎng)可以為30天,Memcache把傳入的過期時(shí)間解釋成時(shí)間點(diǎn)后,當(dāng)?shù)搅诉@個(gè)時(shí)間點(diǎn),Memcache就把item設(shè)置為失效狀態(tài)。當(dāng)使用Memcache存儲(chǔ)數(shù)據(jù)時(shí),設(shè)置一個(gè)值為永久時(shí)間或一段時(shí)間,如果Memcache分配的內(nèi)存使用完畢,則首先會(huì)替換掉已失效的數(shù)據(jù),其次是最近少使用的數(shù)據(jù)。
4.
什么是函數(shù)返回值?正確答案:在PHP中,函數(shù)可以返回一個(gè)值或多個(gè)值,返回值是通過return語(yǔ)句來(lái)實(shí)現(xiàn)的。return語(yǔ)句會(huì)使程序在return處停止,并返回指定的變量。最常用的就是函數(shù)返回一個(gè)值情況,而且這種情況比較簡(jiǎn)單,因此,這里重點(diǎn)介紹返回多個(gè)值的情況。
如果一個(gè)函數(shù)需要返回多個(gè)值,那么可以通過以下兩種方式實(shí)現(xiàn)。
1)返回?cái)?shù)組:通過返回一個(gè)數(shù)組可以達(dá)到返回多個(gè)值的目的。
示例代碼如下:
<?php
functionresults($string)
{
$result=array();
$result[]=strtoupper($string);
//把所有字符轉(zhuǎn)換為大寫
$result[]=strtolower($string);
//把所有字符轉(zhuǎn)換為小寫
$result[]=ucwords($string);
//把所有單詞的首字母換成大寫
return$result;
}
$multi_result=results('helloworld');
print_r($multi_result);
?>
程序的運(yùn)行結(jié)果為
Array
(
[0]=>HELLOWORLD
[1]=>helloworld
[2]=>HelloWorld
)
2)引用:可以給函數(shù)傳遞引用參數(shù),此時(shí)在函數(shù)內(nèi)部對(duì)引用變量值的修改對(duì)實(shí)參也可見。通過這種方法也可以實(shí)現(xiàn)把函數(shù)內(nèi)部對(duì)引用變量的值的修改返回給調(diào)用者,從而實(shí)現(xiàn)了返回多個(gè)值的目的,示例代碼如下:
<?php
functiontest(&$a,&$b)
{
$a*=10;
$b*=10;
return$a+$b;
}
$a=10;
$b=12;
$c=test($a,$b);
//注意這里沒有&了
//顯示修改后的值
echo$a;
//輸出100通過引用返回
echo$b;
//輸出120通過引用返回
echo$c;
//輸出220通過函數(shù)返回
?>
5.
觸發(fā)器分為事前觸發(fā)和事后觸發(fā),二者有什么區(qū)別?語(yǔ)句級(jí)觸發(fā)和行級(jí)觸發(fā)有什么區(qū)別?正確答案:事前觸發(fā)發(fā)生在事件發(fā)生之前驗(yàn)證一些條件或進(jìn)行一些準(zhǔn)備工作;事后觸發(fā)發(fā)生在事件發(fā)生之后,做收尾工作,保證事務(wù)的完整性。而事前觸發(fā)可以獲得之前和新的字段值。語(yǔ)句級(jí)觸發(fā)器可以在語(yǔ)句執(zhí)行之前或之后執(zhí)行,而行級(jí)觸發(fā)在觸發(fā)器所影響的每一行觸發(fā)一次。
四、編程題1.
假設(shè)有一條繩子,上面有紅、白、藍(lán)三種顏色的旗子,起初繩子上的旗子顏色并沒有順序,現(xiàn)在希望將之分類,并排列為藍(lán)、白、紅的順序,要如何移動(dòng)才能讓次數(shù)最少?注意只能在繩子上進(jìn)行這個(gè)動(dòng)作,而且一次只能調(diào)換兩個(gè)旗子。示意圖如下圖所示。
正確答案:在一條繩子上移動(dòng),也就意味著在程序中只能使用一個(gè)陣列,不能使用輔助存儲(chǔ)。問題的解法很簡(jiǎn)單,從繩子開頭進(jìn)行,遇到藍(lán)色往前移,遇到白色留在中間,遇到紅色往后移。如果要讓移動(dòng)次數(shù)最少,那么還需要一些技巧。
算法的主要思路為用三個(gè)下標(biāo)b、w、r分別指向不同的旗子。其中b指向的從0開始連續(xù)排列的藍(lán)色旗子的最后面的第一個(gè)非藍(lán)色旗子,r指向的從最后一個(gè)序號(hào)開始連續(xù)排列的紅色旗子的第一非紅色旗子。例如,bbrwbbrr,那么b指向的就是序號(hào)為2的紅色旗子,r指向的就是序號(hào)為倒數(shù)第3的藍(lán)色旗子。
w作為可移動(dòng)的指針來(lái)指引旗子的移動(dòng),當(dāng)w指向的旗子是白色旗子的時(shí)候,w繼續(xù)向前移動(dòng);當(dāng)w指向的旗子是藍(lán)色的時(shí)候,就需要把b所指的旗子和w所指的藍(lán)色旗子交互;同理當(dāng)w指的旗子是紅色的時(shí)候,就需要w所指的紅色旗子和r所指的旗子交換。
實(shí)現(xiàn)代碼如下:
<?php
header("Content-type:text/html;charset=utf-8");
define("BLUE",'b');
define("WHITE",'w');
define("RED",'r');
functionSWAP($x,$y,&$color){
$temp=$color[$x];
$color[$x]=$color[$y];
$color[$y]=$temp;
}
$color=array('r','b','r','w','r','r','w','b','b','r');
$wFlag=0;
$bFlag=0;
$rFlag=count($color)-1;
echo"棋子開始的排序:";
for($i=0;$i<count($color);$i++)
echo$color[$i];
echo"<br>";
while($wFlag<=$rFlag){
if($color[$wFlag]==WHITE)
$wFlag++;
elseif($color[$wFlag]==BLUE){
SWAP($bFlag,$wFlag,$color);
$bFlag++;
$wFlag++;
}
else{
while($wFlag<$rFlag&&$color[$rFlag]==RED)
$rFlag--;
SWAP($rFlag,$wFlag,$color);
$rFlag--;
}
}
echo"排序后的棋子:";
for($i=0;$i<count($color);$i++)
echo$color[$i];
echo"<br>";
?>
程序的運(yùn)行結(jié)果為
棋子開始的排序:rbrwrrwbbr
排序后的棋子:bbbwwrrrrr
2.
請(qǐng)用PHP編程,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的異常類。正確答案:<?php
classMyExceptionextendsException{
publicfunctionerrmsg(){
$msg="exceptionoccur";
return$msg;
}
}
functionGetNum($num)
{
if($num>10)
{
thrownewMyException("Exceptionocur");
}
returntrue;
}
try{
GetNum(100);
echo"thisisendline"."\n";
}catch(MyException$e){
echo"Exceptionmsg:".$e->errmsg();
}
?>
程序的運(yùn)行結(jié)果為
Exceptionmsg:Exceptionocur
上述代碼拋出了一個(gè)異常,通過自定義的異常類來(lái)捕獲。主要步驟如下:
1)自定義的異常類繼承了超類Exception,這樣就具有了超類的屬性和方法。
2)創(chuàng)建異常函數(shù)errmsg(),返回錯(cuò)誤信息。
3)傳遞不合法的變量,執(zhí)行try代碼塊,拋出異常。
4)catch代碼塊捕獲異常,并顯示錯(cuò)誤信息。
3.
請(qǐng)用PHP編程實(shí)現(xiàn)連接本地的redis操作,并對(duì)變量a進(jìn)行賦值和取值,并刪除變量a。正確答案:<?php
$Redis=newRedis();
$Redis->connect('',6378);
//連接redis
$res=$Redis->set('a',"bbbb");
//對(duì)a賦值
$a=$Redis->get('a');
//對(duì)a取值
$res=$Redis->delete('a');
//刪除a
?>
4.
一個(gè)數(shù)組里,除了三個(gè)數(shù)是唯一出現(xiàn)的,其余的數(shù)都出現(xiàn)偶數(shù)次,找出這三個(gè)數(shù)中的任意一個(gè)。比如數(shù)組序列為[1,2,4,5,6,4,2],只有1,5,6這三個(gè)數(shù)字是唯一出現(xiàn)的,數(shù)字2與4均出現(xiàn)了偶數(shù)次(2次),只需要輸出數(shù)字1,5,6中的任意一個(gè)就行。正確答案:根據(jù)題目描述可以得到如下幾個(gè)有用的信息:
1)數(shù)組中元素個(gè)數(shù)一定是奇數(shù)個(gè)。
2)由于只有三個(gè)數(shù)字出現(xiàn)過一次,顯然這三個(gè)數(shù)字不相同,因此,這三個(gè)數(shù)對(duì)應(yīng)的二進(jìn)制數(shù)也不可能完全相同。
由此可知,必定能找到二進(jìn)制數(shù)中的某一個(gè)bit來(lái)區(qū)分這三個(gè)數(shù)(這一個(gè)bit的取值或者為0,或者為1),當(dāng)通過這一個(gè)bit的值對(duì)數(shù)組進(jìn)行分組的時(shí)候,這三個(gè)數(shù)一定可以被分到兩個(gè)子數(shù)組中,并且其中一個(gè)子數(shù)組中分配了兩個(gè)數(shù)字,而另一個(gè)子數(shù)組分配了一個(gè)數(shù)字,而其他出現(xiàn)兩次的數(shù)字肯定是成對(duì)出現(xiàn)在子數(shù)組中的。此時(shí)只需要重點(diǎn)關(guān)注哪個(gè)子數(shù)組中分配了這三個(gè)數(shù)中的其中一個(gè),就可以很容易地找出這個(gè)數(shù)字了。當(dāng)數(shù)組被分成兩個(gè)子數(shù)組時(shí),這一個(gè)bit的值為1的數(shù)被分到一個(gè)子數(shù)組subArray1,這一個(gè)bit的值為0的數(shù)被分到另外一個(gè)子數(shù)組subArray0。
1)如果subArray1中元素個(gè)數(shù)為奇數(shù)個(gè),那么對(duì)subArray1中的所有數(shù)字進(jìn)行異或操作;由于a^a=0,a^0=a,出現(xiàn)兩次的數(shù)字通過異或操作得到的結(jié)果為0,然后與只出現(xiàn)一次的數(shù)字執(zhí)行異或操作,得到的結(jié)果就是只出現(xiàn)一次的數(shù)字。
2)如果subArray0中元素個(gè)數(shù)為奇數(shù)個(gè),那么對(duì)subArray0中所有元素進(jìn)行異或操作得到的結(jié)果就是其中一個(gè)只出現(xiàn)一次的數(shù)字。
為了實(shí)現(xiàn)上面的思路,必須先找到能區(qū)分這三個(gè)數(shù)字的bit位,根據(jù)以上的分析給出本算法的實(shí)現(xiàn)思路:
以32位平臺(tái)為例,一個(gè)int類型的數(shù)字占用32位空間,從右向左使用每一位對(duì)數(shù)組進(jìn)行分組,分組的過程中,計(jì)算這個(gè)bit值為0的數(shù)字異或的結(jié)果result0,出現(xiàn)的次數(shù)count0;這個(gè)bit值為1的所有數(shù)字異或的結(jié)果result1,出現(xiàn)的次數(shù)count1。
如果count0是奇數(shù)且result1!=0,那么說明這三個(gè)數(shù)中的其中一個(gè)被分配到這一bit為0的子數(shù)組中,因此,這個(gè)子數(shù)組中所有數(shù)字異或的值result0一定是出現(xiàn)一次的數(shù)字。(如果result1==0,說明這一個(gè)bit不能用來(lái)區(qū)分這三個(gè)數(shù)字,此時(shí)這三個(gè)數(shù)字都被分配到子數(shù)組subArray0中,因此,result1!=0就可以確定這一個(gè)bit可以被用來(lái)區(qū)分這三個(gè)數(shù)字的。)
同理,如果count1是奇數(shù)且result0!=0,那么result1就是其中一個(gè)出現(xiàn)1次的數(shù)。
以[6,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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è)權(quán)抵押融資合同示范3篇
- 二零二五年新型環(huán)保欄桿研發(fā)、生產(chǎn)安裝合同3篇
- 二零二五版礦業(yè)權(quán)轉(zhuǎn)讓與安全生產(chǎn)監(jiān)管服務(wù)合同集3篇
- 二零二五版建筑工程BIM模型優(yōu)化與交付合同3篇
- 二零二五年混凝土施工安全生產(chǎn)責(zé)任書合同3篇
- 二零二五版掛靠出租車綠色出行獎(jiǎng)勵(lì)合同3篇
- 提前終止2025年度租賃合同2篇
- 商鋪售后返租合同糾紛的司法解釋與實(shí)踐(2025年版)2篇
- 二零二五版畜禽養(yǎng)殖合作經(jīng)營(yíng)合同書3篇
- 二零二五年度廢舊玻璃回收利用合同書3篇
- 電磁閥培訓(xùn)(精選)課件
- A彌漫大b細(xì)胞淋巴瘤護(hù)理查房
- 維保移交協(xié)議范本
- 初一上學(xué)期期末測(cè)試卷英語(yǔ)
- 上海沃陸變頻器VL600型變頻器說明書概要
- 2023年高考物理一輪復(fù)習(xí):拋體運(yùn)動(dòng)與圓周運(yùn)動(dòng)(附答案解析)
- VRV空調(diào)技術(shù)要求和質(zhì)量標(biāo)準(zhǔn)
- 第二講VSP地震勘探
- 干砌石護(hù)坡工程施工組織設(shè)計(jì)方案
- 物業(yè)品質(zhì)提升ppt課件
- -烏兔太陽(yáng)擇日法表
評(píng)論
0/150
提交評(píng)論