




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
某知名共享單車公司PHP工程師面試筆試真題6一、選擇題1.
實驗高中的小明暗戀女神同學已經(jīng)三年了,高考結束后,小明決定向女神同學表白。這天,小明來到女神樓下等待女神的出現(xiàn),時間一分一秒地流逝,兩個多小時過(江南博哥)去了,女神還沒有出現(xiàn),小明看了下表,時針和分針的位置正好跟開始等的時候互換,請問小明一共等了女神______分鐘。A.165B.150C.172D.166正確答案:D[解析]根據(jù)題目中的描述,可以畫一個表示時針與分針的圖例,如下圖所示。
假設小明開始等待女神的那一時刻時針與分針的夾角為θ弧度,那么,等到時針與分針正好互換位置時,時針走過了θ弧度,而由于分針轉動一圈表示的時間為一個小時,鐘表一圈是一個圓,表示的弧度值為2π,分針因為要轉若干圈才能到達時針的位置,記分鐘所轉圈數(shù)為n,此時分針轉過的角度則為2πn-θ弧度。
題目強調,“時間一分一秒地流逝,兩個多小時過去了,女神還沒有出現(xiàn)”,通過這條信息可知,分針轉了2~3圈,接近3圈,此時可知,n值取3,所以,時針轉過的角度值為0,分針轉過的角度值為2π*3-θ=6π-θ。
對于時針而言,2π代表一圈,即12個小時,那么弧度θ表示的時間值為12*θ/2π小時,對于分針而言,2π代表一圈,即60分鐘,那么6π-θ表示的是60*(6π-θ)/2π分鐘。由于時鐘走過的時間值與分鐘走過的時間值所代表的時間量是一個量,故而二者是相等的,由此可以構建如下等式關系:
(12θ/2π)*60=60*(6π-θ)/2π
求解上述等式可知,θ=6π/13,即小明等待的時間反映在鐘表上為6π/13弧度值,所以,小明一共等了12*(6π/13)/2π小時,即36/13小時,合166分鐘。
所以,本題的答案為D。
2.
全等運算符===如何比較兩個值?______A.把它們轉換成相同的數(shù)據(jù)類型再比較轉換后的值B.只在兩者的數(shù)據(jù)類型和值都相同時才返回trueC.如果兩個值是字符串,則進行詞匯比較D.基于strcmp函數(shù)進行比較正確答案:B[解析]全等運算符主要比較兩者數(shù)據(jù)類型和值是否相等,都相等時才會返回true。
本題中,對于選項A,全等運算符是先比較它們的值是否相等,如果不相等,那么返回false;如果相等,那么比較數(shù)據(jù)類型是否相等。并不是先轉換相同的數(shù)據(jù)類型,再進行值的比較。選項A錯誤。
對于選項B,全等運算符是比較兩者的數(shù)據(jù)類型和值是否都相等,如果數(shù)據(jù)類型和值都相等,那么返回true。選項B正確。
對于選項C,如果比較的兩個值都是字符串,那么會對每個字符進行比較,而不是進行詞匯比較。選項C錯誤。
對于選項D,strcmp只能用來比較兩個字符串的值是否相等,而全等比較還能比較兩個數(shù)據(jù)的類型是否相等,顯然它們的功能是不同的,因此全等也不是基于strcmp實現(xiàn)的。選項D錯誤。
所以,本題的答案為B。
3.
可以用來表現(xiàn)以下條件判斷最合適的語法結構是______
if($a=='a'){
somefunction();
}elseif($a=='b'){
anotherfunction();
}elseif($a=='c'){
dosomething();
}else{
donothing();
}A.沒有default的switch語句B.一個遞歸函數(shù)C.while語句D.有default的switch語句正確答案:D[解析]對于if...elseif...else結構的分支結構程序可以使用switch語句進行優(yōu)化,從而可以避免冗長的代碼塊。本題中,else相當于switch里面的default部分,即條件沒有符合的都可以執(zhí)行到default里面的語句。選項A錯誤,選項D正確。
邏輯判斷語句是不可能被改成循環(huán)語句或遞歸函數(shù)完成對應功能的,選項B選項C錯誤。
所以,本題的答案為D。
4.
假設$a=5,有$b=($a--),則$b是______A.4B.5C.6D.0正確答案:B[解析]$b=($a--)相當于$b=$a--,$a--會先把$a的值賦值給$b再減1,得到$b=5。
所以,本題的答案為B。
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值的方法應該為$multi_array['yellow']['orange'][1]。選項E正確。
所以,本題的答案為E。
6.
下面關于PHP抽象類的描述中,錯誤的是______A.PHP中抽象類使用abstract關鍵字定義B.沒有方法體的方法叫抽象方法,包含抽象方法的類必須是抽象類C.抽象類中必須有抽象方法,否則不叫抽象類D.抽象類不能實例化,也就是不可以new成對象正確答案:C[解析]抽象類可以是個空類,也就是不一定需要有抽象方法。但抽象方法只能存在抽象類中。選項C錯誤。
所以,本題的答案為C。
7.
在PHP的類中要使用定義的變量或函數(shù)時,要使用某種方式來指向類中的變量,下列選項中,錯誤的是______(三選)A.$it->B.$my->C.$this->D.$I->正確答案:ABD[解析]在類中指向定義的屬性或方法只能使用“$this->”的方式指向,選項A選項B選項D正確。
所以,本題的答案為ABD。
8.
下面有關require()和include()的描述中,說法錯誤的是______A.require函數(shù)通常放在PHP程序的最前面B.include函數(shù)一般是放在流程控制的處理部分中C.require_once語句和require語句完全相同,唯一區(qū)別是PHP會檢查該文件是否已經(jīng)被包含過,如果是,則不會再次包含D.require在引入不存在的文件時產生一個警告且腳本還會繼續(xù)執(zhí)行,而include則會導致一個致命性錯誤且腳本停止執(zhí)行正確答案:D[解析]require和include引用文件和使用方法幾乎完全一樣,除了處理失敗的方式不同之外,require在出錯時產生E_COMPILE_ERROR級別的錯誤。換句話說,require將導致腳本中止而include只產生警告(E_WARNING),腳本會繼續(xù)運行。
include在引入不存在的文件時產生一個警告且腳本還會繼續(xù)執(zhí)行,而require則會導致一個致命性錯誤且腳本停止執(zhí)行。
所以,本題的答案為D。
9.
正則表達式可以被用來實現(xiàn)______(雙選)A.過濾特定的字符串B.查找指定的匹配字符C.完成頁面的跳轉D.轉換字符編碼正確答案:AB[解析]正則表達式可以匹配查找替換字符串,也可以過濾字符串中包含的特定字符串。選項A選項B正確。
正則表達式不具備頁面跳轉功能和轉換字符編碼的功能。選項C選項D錯誤。
所以,本題的答案為AB。
10.
處理HTTP文件上傳時,PHP把文件存儲在$FILES中。在PHP腳本的執(zhí)行周期中,這些文件將被放在本地的臨時文件夾里,而在腳本結束后,文件將被自動刪除。在處理HTTP文件上傳時,確保當前操作的文件是正確的方法有______(雙選)A.操作前,將文件名與瀏覽器報告的文件名對比B.操作前,用fileexists函數(shù)確保文件存在C.用isuploadedfile()函數(shù)確認文件的確是通過HTTP方式傳輸過來的D.用moveuploadfile()將文件移動到安全位置E.只信任PHP存儲臨時文件目錄下的文件正確答案:CD[解析]在上傳前,一定要用is_uploaded_file()函數(shù)確保文件名正確傳輸,并把本地臨時文件通過move_upload_file()函數(shù)在上傳文件前檢查文件,再移動文件到安全位置進行長期保存,防止文件丟失。而在操作前不需要特意地對文件名進行對比和使用。file_exists()函數(shù)判斷文件是否存在。其次,文件的上傳,PHP并不是只信任臨時文件目錄下的文件。選項C選項D正確。
所以,本題的答案為CD。
11.
如果用+操作符把一個字符串和一個整型數(shù)字相加,那么結果是______A.解釋器輸出一個類型錯誤B.字符串將被轉換成數(shù)字,再與整型數(shù)字相加C.字符串將被丟棄,只保留整型數(shù)字D.字符串和整型數(shù)字將連接成一個新字符串E.整型數(shù)字將被丟棄,而保留字符串正確答案:B[解析]字符串將被轉換成數(shù)字(如果無法發(fā)生轉換,那么就是0),然后與整型數(shù)字相加。
所以,本題的答案為B。
12.
下列函數(shù)不是被用于處理數(shù)組的是______A.in_array()B.array_slice()C.list()D.intval()正確答案:D[解析]本題中,in_array()函數(shù)可以判斷值是否在數(shù)組中,array_slice()函數(shù)可以在數(shù)組中根據(jù)條件取出一段值,list()函數(shù)可以一次操作所有的變量,無論是單個變量還是數(shù)組都可以。而intval()函數(shù)是獲取數(shù)據(jù)的整數(shù)值,不能用于對象中。選項D正確。
所以,本題的答案為D。
13.
以下關于PHP文件處理的說法中,正確的是______A.file_get_contents()函數(shù)能用來抓取網(wǎng)頁數(shù)據(jù),但是沒辦法設置超時時間B.file()函數(shù)既能讀取文本文件也能讀取二進制文件,但是讀取二進制文件有可能出現(xiàn)安全問題C.如果表單中沒有選擇上傳的文件,則PHP變量的值將為NULLD.fsockopen()和fputs()結合起來可以發(fā)送郵件,也可以用來抓取網(wǎng)頁內容、下載ftp文件等正確答案:C[解析]對于選項A,可以通過context參數(shù)設置超時時間。選項A錯誤。
對于選項B,file()函數(shù)可以安全用于讀取二進制文件。選項B錯誤。
對于選項C,表單中沒有文件上傳時,PHP的$_FILES變量值為NULL。選項C正確。
對于選項D,fputs()用于寫入字符串到文件中時,只能用于上傳不能用于下載ftp文件。選項D錯誤。
所以,本題的答案為C。
14.
下列PHP配置項中,和安全最不相關的是______A.open_basedirB.register_globalsC.disable_functionsD.file_uploads正確答案:D[解析]對于選項A,open_basedir可將用戶訪問文件的活動范圍限制在指定的區(qū)域,通常是其家目錄的路徑,也可用符號“.”來代表當前目錄。注意,用open_basedir指定的限制實際上是前綴,而不是目錄名。舉例來說,若“open_basedir=/dir/user”,那么目錄“/dir/user”和“/dir/user1”都是可以訪問的。所以如果要將訪問限制在僅為指定的目錄,那么要用斜線結束路徑名。例如,設置成“open_basedir=/dir/user/”。
對于選項B,register_globals的意思就是注冊為全局變量,所以當它的值被設為on的時候,傳遞過來的值會被直接注冊為全局變量來使用。當被設為off的時候,要到特定的數(shù)組里去獲得它。但需要注意的是:
1)從PHP4.2.0版開始,配置文件中register_globals的默認值從on改為off,雖然可以設置它為on,但是當無法控制服務器的時候,代碼的兼容性就成為一個大問題,所以,最好從現(xiàn)在就開始使用off的風格來編程。
2)當register_globals打開以后,各種變量都會被注入代碼中,例如,來自HTML表單的請求變量。再加上PHP在使用變量之前是無須進行初始化的,這就使得更容易寫出不安全的代碼。當打開時,人們使用變量時確實不知道變量是哪里來的。但是register_globals的關閉改變了這種代碼內部變量和客戶端發(fā)送的變量混雜在一起的糟糕情況。
對于選項C,disable_functions限制程序使用一些可以直接執(zhí)行系統(tǒng)命令的函數(shù),如system、exec、passthru、shell_exec、proc_open等。所以如果想保證服務器的安全,那么要將這個函數(shù)加到disable_functions里或者將安全模式打開。
對于選項D,file_uploads是決定PHP文件上傳時記錄file_uploads指令是否啟用的函數(shù),默認值為on。該函數(shù)和安全最不相關,選項D正確。
所以,本題的答案為D。
15.
在PHP中,使用sendmail程序從Windows或Novell系統(tǒng)中發(fā)送郵件的方式,與從類UNIX系統(tǒng)中發(fā)送的方式不同。以下哪些選項說明了這個不同?______(雙選)A.Windows/Novell不需要第三方軟件的支持就能實現(xiàn)該功能B.UNIX中,sendmail_from的配置決定了郵件頭中的From信息C.在Windows/Novell中,無法發(fā)送有多個收件人的電子郵件,每個收件人都必須單獨發(fā)送D.有可能完全相同,這取決于sendmailpath的配置E.不同于Windows/Novell,在UNIX中,必須用SMTP和smtp_port配置好MTA主機和端口正確答案:AD[解析]對于選項A,Windows/Novell版本通過SMTP可以直接用MTA發(fā)送郵件,而UNIX的PHP需要用sendmail程序通過MTA發(fā)送郵件。選項A正確,選項E錯誤。
對于選項B,在Windows/Novell上使用mail()時,需要配置sendmail_from才能使用,并不是通過sendmail_from配置決定郵件中的From信息。而UNIX發(fā)郵件是交給sendmail程序來處理的。選項D正確,選項B錯誤。
對于選項C,條件允許的情況下,Windows/Novell上的PHP可以進行配置,通過“sendmail”封裝器模擬sendmail發(fā)信,可以發(fā)送多個收件人的電子郵件。選項C錯誤。
所以,本題的答案為AD。
二、填空題1.
假設機器上沒有安裝sendmail,要想mail函數(shù)能在Windows下使用,需要______。正確答案:改變php.ini的設置。[解析]在UNIX、Linux系統(tǒng)中,PHP主要使用sendmail程序來處理郵件。而在Windows中除非已經(jīng)有sendmail包裝器,否則只能使用服務器的SMTP配置進行,而SMTP是可以在php.ini文件中進行配置開啟的。
2.
PHP支持的流傳輸方式的是______和______。正確答案:STDIO、stream。[解析]PHP只支持兩種流傳輸,分別為本地操作的STDIO和遠程操作的stream,并且可以根據(jù)創(chuàng)建的流的類型來自動選擇合適的傳輸方式。
3.
能讓類在整個腳本里只實例化一次的設計模式是______。正確答案:單例模式。[解析]單例模式是一種用于確保程序中只有一個類實例化的程序。
4.
使用final關鍵字時,應注意的問題有______、______、______。正確答案:定義的類禁止繼承;定義的成員禁止繼承;定義的方法禁止重寫。
5.
即時加載一個類的方法是______。正確答案:spl_autoload_register()函數(shù)。[解析]spl_autoload_registerl()提供了一種更加靈活的方式來實現(xiàn)類的自動加載(同一個應用文件中,可支持任意數(shù)量的加載器,比如第三方庫中的類文件)。而_autoload()函數(shù)在PHP7.2版本中已經(jīng)被廢除。
三、簡答題1.
5名海盜搶得了窖藏的100枚金幣,并打算瓜分這些戰(zhàn)利品。這是一些講民主的海盜(當然是他們自己特有的民主),他們的習慣是按下面的方式進行分配:最厲害的一名海盜提出分配方案,然后所有的海盜(包括提出方案者本人)就此方案進行表決。如果50%或更多的海盜贊同此方案,此方案就獲得通過并據(jù)此分配戰(zhàn)利品。否則提出方案的海盜將被扔到海里,然后下一名最厲害的海盜又重復上述過程。
所有的海盜都樂于看到他們的一位同伙被扔進海里,不過,如果讓他們選擇的話,他們還是寧可得一筆現(xiàn)金。他們當然也不愿意自己被扔到海里。所有的海盜都是有理性的,而且知道其他的海盜也是有理性的。此外,沒有兩名海盜是同等厲害的——這些海盜按照完全由上到下的等級排好了座次,并且每個人都清楚自己和其他所有人的等級。這些金塊不能再分,也不允許幾名海盜共有金塊,因為任何海盜都不相信他的同伙會遵守關于共享金塊的安排。這是一伙每人都只為自己打算的海盜。
最兇的一名海盜應當提出什么樣的分配方案才能使他獲得最多的金子呢?正確答案:如果輪到第四個海盜分配:100,0;
輪到第三個:99,0,1;
輪到第二個:99,0,1,0;
輪到第一個:98,0,1,0,1,這就是第一個海盜的最佳方案。
可以從后往前推測每次最優(yōu)的方案,從而確定第一種方案就是最好的。
1)當只剩兩個海盜分金時,因為只要有50%或以上的支持率則方案通過,所以第四個海盜和第五個海盜分金時,無論第五個海盜是否支持自己,第四個海盜都可以給自己分配100枚金幣。
2)當只剩三個海盜分金時,第三個海盜分金的方案,除了自己的支持外,還需要一個海盜的支持,否則方案不通過。所以,如果第三個海盜想要拿最多金幣,最好的方案就是讓第五個海盜得到金幣來支持他,因為第四個海盜可以通過否定第三個海盜的方案實現(xiàn)自己的利益最大化。所以,第三個海盜得99枚金幣,而第五個海盜得1枚金幣的方案是最好的方案。
3)當只剩下四個海盜分金時,第二個海盜的方案,只需要一個海盜支持他即可通過方案。由2)的分析知道,要第四個海盜支持自己是最有利的,所以可以得到最好的方案是第二個海盜得99枚金幣,第四個海盜得1枚金幣的方案。
最初的情況,5個海盜分金,第一個海盜必須要其余2名海盜支持自己,他才有可能得到最多的金幣。通過3)的分析知道,分配給第三個海盜和第五個海盜1枚金幣,讓他們支持自己是最優(yōu)的方案。
2.
如何定義一個函數(shù)?函數(shù)名區(qū)分大小寫嗎?正確答案:定義一個函數(shù)的步驟為以下幾點,函數(shù)名的大小寫是不區(qū)分的。
1)通過function關鍵字聲明函數(shù),格式為function函數(shù)名(){}。
2)函數(shù)命名遵循變量命名的規(guī)則,以字母或下劃線開頭,且不能以數(shù)字開頭。
3)函數(shù)名不可以使用系統(tǒng)函數(shù)的名稱,且不能使用已經(jīng)聲明過的函數(shù)名。
PHP中函數(shù)名、方法名、類名不區(qū)分大小寫,但PHP的變量名是區(qū)分大小寫的。
實現(xiàn)代碼為
<?php
functionabc(){
echo"1";
}
ABC();
?>
程序運行結果為1。
從上面運行結果可以看出,函數(shù)名是abc小寫,但是可以通過ABC大寫去調用該函數(shù)。
3.
談談你對MVC的認識,介紹幾種目前比較流行的MVC框架。正確答案:MVC是一種設計模式,由模型層、邏輯層和視圖層組成。用戶通過入口訪問到控制器,控制器從模型層獲取數(shù)據(jù)然后分配視圖,并加載數(shù)據(jù)到視圖層。用戶通過視圖層操作向邏輯層反饋,邏輯層處理反饋,如果涉及數(shù)據(jù)庫操作,那么將會在模型層中對數(shù)據(jù)庫增、刪、改、查。最后邏輯層將執(zhí)行結果返回到視圖層。
目前比較流行的MVC框架有Laravel、ThinkPHP、Yii、codeIgniter、CakePHP等。
4.
請介紹說明觀察者模式。正確答案:觀察者模式(也被稱為發(fā)布/訂閱模式)提供了避免組件之間緊密耦合的另一種方法,它將觀察者和被觀察的對象分離開。在該模式中,一個對象通過添加一個方法(該方法允許另一個對象,即觀察者注冊自己)使本身變得可觀察。當可觀察的對象更改時,它會將消息發(fā)送到已注冊的觀察者。這些觀察者使用該信息執(zhí)行的操作與可觀察的對象無關,結果是對象可以相互對話,而不必了解原因。
例如,用戶界面可以作為一個觀察者,業(yè)務數(shù)據(jù)是被觀察者,用戶界面觀察業(yè)務數(shù)據(jù)的變化,發(fā)現(xiàn)數(shù)據(jù)變化后,就顯示在界面上。面向對象設計的一個原則是,系統(tǒng)中的每個類將重點放在某一個功能上,而不是其他方面。一個對象只做一件事情,并且將它做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應用程序的可維護性和重用性。
實現(xiàn)的代碼如下:
<?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;
}
}
}
}
//模擬一個可以被觀察的類
classAextendsObservable
{
publicfunctionaddListener($listener)
{
foreach($this->observersas$observer)
{
$observer->onListen($this,$listener);
}
}
}
//模擬一個觀察者類
classBextendsObserver
{
protected$observer_name='B';
publicfunctiononListen($sender,$args)
{
var_dump($sender);
echo"<br>";
var_dump($args);
echo"<br>”;
}
}
//模擬另外一個觀察者類
classCextendsObserver
{
protected$observer_name='C';
publicfunctiononListen($sender,$args)
{
var_dump($sender);
echo"<br>";
var_dump($args);
echo"<br>";
}
}
$a=newA();
//注入觀察者
$a->addObserver(newB());
$a->addObserver(newC());
//可以看到觀察到的信息
$a->addListener('D');
//移除觀察者
$a->removeObserver('B');
?>
5.
Memcache的工作原理是什么?正確答案:Memcache的工作就是在專門的機器內存里維護一張巨大的hash表,存儲經(jīng)常被讀寫的一些文件與數(shù)據(jù),從而極大地提高網(wǎng)站的運行效率。
Memcache的程序運行在一個或多個服務器中,Memcache把全部的數(shù)據(jù)保存在內存中,通過hash表的方式,每條數(shù)據(jù)由key/value的形式構成,隨時接受客戶端的請求,然后返回結果。
客戶端與Memcache建立連接后,存儲對象主要是通過唯一的key存儲value到內存中,取數(shù)據(jù)時通過這個key從內存中獲取對應的value。因為Memcache的數(shù)據(jù)是存儲在內存中而不是保存在cache文件中,所以Memcache訪問比較快。但是因為這些數(shù)據(jù)不是永久化存儲,所以不建議存儲重要數(shù)據(jù)在Memcache中,因為重啟服務器后這些數(shù)據(jù)就會消失。
四、編程題1.
數(shù)字1~1000放在含有1001個元素的數(shù)組中,其中只有唯一的一個元素值重復,其他數(shù)字均只出現(xiàn)一次。設計一個算法,將重復元素找出來,要求每個數(shù)組元素只能訪問一次。如果不使用輔助存儲空間,能否設計一個算法實現(xiàn)?正確答案:拿到題目,首先需要做的就是分析題目所要達到的目標以及其中的限定條件。從題目的描述中可以發(fā)現(xiàn),本題的目標就是在一個有且僅有一個元素值重復的數(shù)組中找出這個唯一的重復元素,而限定條件就是每個數(shù)組元素只能訪問一次,并且不許使用輔助存儲空間。
示例代碼如下:
<?php
/*
**函數(shù)功能:在數(shù)組中找唯一重復的元素
**輸入?yún)?shù):array數(shù)組首地址,len數(shù)組長度
**返回值:重復元素的值,無重復元素則返回-1
*/
functionfindDup($array)
{
$len=count($array);
if(!$array||$len<1)
return-1;
$newArr=array();
for($i=0;$i<$len-1;$i++)
$newArr[$i]=0;
for($i=0;$i<$len;$i++)
{
if($newArr[$array[$i]-1]==0)
{
$newArr[$array[$i]-1]=1;
}else
{
return$array[$i];
}
}
return-1;
}
$array=[1,3,4,2,5,3];
printf("%d",findDup($array));
?>
程序的運行結果為
3
2.
設計一個算法,判斷給定的一個數(shù)n是否是某個數(shù)的平方,不能使用開方運算。例如,16就滿足條件,因為它是4的平方;而15則不滿足條件,因為不存在一個數(shù)使得其平方值為15。正確答案:通過對平方數(shù)進行分析發(fā)現(xiàn)有如下規(guī)律:
(n+1)^2=n^2+2n+1=(n-1)^2+(2*(n-1)+1)+2*n+1=…=1+(2*1+1)+(2*2+1)+…+(2*n+1)。
通過上式可以發(fā)現(xiàn),這些項構成了一個公差為2的等差數(shù)列的和。由此可以得到如下的解決方法:對n依次減1,3,5,7,…,如果相減后的值大于0,則繼續(xù)減下一項;如果相減的后的值等于0,則說明n是某個數(shù)的平方;如果相減后的值小于0,則說明n不是某個數(shù)的平方。根據(jù)這個思路,代碼實現(xiàn)如下:
functionisPower($n)
{
if($n<=0)
{
printf("%d不是自然數(shù)\n",n);
returnfalse;
}
$minus=1;
while($n>0)
{
$n=$n-$minus;
//n是某個數(shù)的平方
if($n==0)
returntrue;
//n不是某個數(shù)的平方
elseif($n<0)
returnfalse;
//每次減數(shù)都加2
else
$minus+=2;
}
returnfalse;
}
3.
用類編程實現(xiàn):Stu類中有兩個私有屬性name和sex,有兩個公有方法,setName()和setSex()參數(shù)自定,方法可實現(xiàn)對兩個私有屬性進行修改。在實例化類的時候要求對私有屬性能初始化。正確答案:實現(xiàn)代碼如下:
<?php
ClassStu{
private$name;
private$sex;
publicfunctionsetName($name){
$this->name=$name;
}
publicfunctionsetSex($sex){
$this->sex=$sex;
}
}
?>
4.
把鏈表相鄰元素翻轉,例如,給定鏈表為1->2->3->4->5->6->7,則翻轉后的鏈表變?yōu)?->1->4->3->6->5->7。正確答案:主要思路為,通過調整結點指針域的指向來直接調換相鄰的兩個結點。如果單鏈表恰好有偶數(shù)個結點,那么只需要將奇偶結點對調,如果鏈表有奇數(shù)個結點,那么除最后一結點外的其他結點進行奇偶對調。為了便于理解,下圖給出了其中第一對結點對調的方法。
在上圖中,當前遍歷到結點cur,通過①~⑥6個步驟用虛線的指針來代替實線的指針實現(xiàn)相鄰結點的逆序。其中,①~④實現(xiàn)了前兩個結點的逆序操作,⑤和⑥兩個步驟向后移動指針,接著可以采用同樣的方式實現(xiàn)后面兩個相鄰結點的逆序操作。
實現(xiàn)代碼如下:
<?php
header("content-type:text/html;charset=utf-8");
//鏈表結點
classnode{
public$data;
//存儲數(shù)據(jù)
public$next;
//下一結點
publicfunction__construct($data){
$this->data=$data;
$this->next=NULL;
}
}
//單鏈表
classlinkList{
private$header;
//鏈表頭結點
//構造方法
publicfunction__construct($data=NULL){
$this->header=newnode($data);
}
//添加結點數(shù)據(jù)
publicfunctionaddLink($node){
$current=$this->header;
while($current->next!=NULL){
$current=$current->next;
}
$node->next=$current->next;
$current->next=$node;
}
//刪除鏈表結點
publicfunctionfree($data){
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 代管店鋪合同范例
- 冷凍雞肉供貨合同范例
- 光纖入股合同范例
- ktv營銷業(yè)績提成合同范例
- 公司轉讓設備合同范例
- 買房定金合同范例
- 上海導游合同范例
- 代理勞務派遣合同范例
- 傷亡免責合同范例
- 韌性視角的川西南昭覺河城市河流廊道景觀設計研究
- 社會心理學:社會心理學的研究方法完整版
- 預防住院患者跌倒墜床的防范措施及宣教
- 地坪漆施工合同地坪漆施工合同范本
- (完整)2-吸附脫附等溫線及吸附理論
- 2023年全國甲卷作文真題導寫-2024年高考語文一輪復習作文備考特輯(全國通用)
- 畢業(yè)設計(論文)-基于PLC的供水控制系統(tǒng)設計
- 金稅四期下的稅務風險與防范
- 把未來點亮歌詞打印版
- 國家中醫(yī)藥管理局第3批24個專業(yè)104個病種中醫(yī)診療方案
- 國際結算實驗
- 2023年江西工業(yè)貿易職業(yè)技術學院高職單招(語文)試題庫含答案解析
評論
0/150
提交評論