百度的面試,尤其是初面,整體面試不是很難的。前兩輪技術面試都需要手寫程式碼的,主要涉及的類別有語言基礎、設計模式、演算法基礎、資料庫。最重視的就是基礎,基礎,還是基礎。涉及的面比較廣,但都是程式設計師應當也應該知道的東東。答案僅供參考。 (文章摘自網路)
現整理10個問題如下:
1、PHP的整型溢出問題是怎樣的
2、如何理解OOP
3、你對於設計模式和MVC的理解
4、 HTTP協定1.0及1.1的區別,並簡單說下HTTP協定
5、簡單說下Apache中rewrite機制和PHP框架中URI路由機制
6、MySQL的索引機制,複合索引的使用原則
7、 MySQL的表格類型及MyISAM與InnoDB的區別
8、簡單說下快速排序演算法
9、awk、sed、sort的基本使用(用實例考察的)
10、Memcached、redis的使用和理解
================================================
【1】PHP的整數溢位問題是怎樣的
PHP的整數數的字長和平台有關,對於32位元的作業系統,最大的整數是有二十多億,其實就是2的31次方,最小為-2的31次方,PHP不支援無符號的整數。 如果一個數字超出了integer範圍,將會自動解釋為float。如果執行的運算結果超出了 integer 範圍,也會傳回 float。 (那在java、C中的整型整數溢位會怎樣)
【2】如何理解OOP
OOP,物件導向編程,包括三個方面,繼承性、封裝性、多態性,其中最根本的東西就是抽象。
繼承性,即擴展性,透過子類別對已經存在的父類別進行功能擴展。
封裝性,要求外部不能隨意訪問對象的內部數據,即對該類中的具體實現做封裝,用戶不必知道內部的具體實現,只有知道它是乾什麼的,怎麼用就好了。
多態性,就是類別的抽象和接口,同一個類別能夠處理多種類型物件的能力。
我們在現實中,看到的任何東東都可以看做為一個對象,然後通過進一步的抽象為類,類又可以演變為很多類似的對象。舉個簡單的例子,將我們看到的一個房子抽象化為一個ROOM類,包括基本的門,窗,桌子等物件,人可以進出等功能。 現在我們繼承ROOM類別為Classroom,包括扇門,有大窗,有桌椅,另外只包括一個黑白和一個講台,老師和同學可以上課。現在我們實例化這個Classroom類別為Classroom_621物件,包括兩扇門,四扇大窗,30套桌椅,有同學正在上毛概課。
【3】你對設計模式和MVC的理解
Model-View-Controller,模型、視圖、控制器,一想到MVC就會想到JAVA,因為JAVA是一個完全物件導向的語言,MVC最早出現在smalltalk中,其核心就是要將試圖和資料模型分離,這樣不同的程式就可以有不同的展示。
模型,也就是程式設計師寫的功能、演算法和資料模型,也就是我們所說的系統業務邏輯層。
視圖,即前端,圖形介面。展示給使用者看的。
控制器,主要負責對請求處理、轉送和載入視圖。
設計模式,說白了就是代碼的設計經驗的總結和歸類,設計模式最早應用於建築行業,編程的設計模式按最早的GoF所述,包括23種設計模式,主要用於面向對象的程序程式設計.遵循幾個設計原則:開閉原則、單一職責原則、里氏替換原則、依賴注入、介面分離、迪米特原則、優先使用組合而不是繼承等等。包括創建型模式、結構性模式、行為模式三類。
【4】HTTP協定1.0及1.1的區別,並簡單說下HTTP協定
HTTP,超文本傳輸協定。它定義了瀏覽器和伺服器的通訊規則。 HTTP協定是基於TCP/IP的TCP協定上,現在萬維網使用的是HTTP1.1版本,其特性包括,C/S模式,請求簡單(GET/POST/HEAD),靈活(可以傳輸任何類型的資料HTML 、XML、JSON、自訂等),無連線(每次連線只處理一個請求,從發出請求到收到200狀態為止斷開連線),無狀態。
對HTTP協定的考察主要包括,回應訊息格式、請求訊息格式、狀態碼等知識點。
一般一個HTTP協定包括:起始行(start line)、首部(header)、主體(body)三個部分。
[回應訊息格式]
HTTP/1.1 200 0K
Connectlon:close
Date: Thu, 13 Oct 2005 03:17:33 GMTMTSLache Nodified:Mon,22 Jun 1998 09;23;24 GMT
Content—Length:682l
Content—Type:text/html
這個回應訊息分為3部分:1個起始的狀態行(status line) ,首部、1個包含所請求對象本身的附屬體。狀態行有3個欄位:協定版本欄位、狀態碼欄位、原因短語欄位。
[請求訊息格式]
GET /somedir/page.html HTTP/1.1
Host:www.chinaitlab.com
Connection:close
User-agent:Mozilla/4.0
Accept-language:zh-cn
(額外的回車符和換行符)
該請求訊息的第一行稱為請求行(request line),後續各行都稱為頭部行(header)。請求行有3個欄位:方法欄位、URL欄位、HTTP版本欄位。
[狀態碼]請參閱http://www.cnblogs.com/TankXiao/archive/2013/01/08/2818542.html
1xx 訊息
2xx 成功重定向5xx 伺服器錯誤
[常見狀態碼]
200 OK。請求已成功,請求所希望的回應頭或資料體將隨此回應傳回。
300 Multiple Choices。請求資源有多個選擇,例如請求文字有法文版、英文版等等。
301 Moved Permanently。表示請求的網頁已永久轉移到新位置
302 Found。表示頁面在做臨時跳轉時返回的狀態。
304 Not Modified。客戶的快取資源是最新的, 要客戶端使用快取。
400 Bad Request。錯誤的請求。
403 Forbidden。請求被伺服器拒絕了。
404 Not Found。表示伺服器找不到請求的網頁,伺服器上不存在的網頁經常會傳回的HTTP狀態碼。
500 Internal Server Error。
503 Service Unavailable。伺服器目前無法為請求提供服務,但過一段時間就可以恢復服務。
504 Gateway Timeout。與狀態嗎408類似, 但是回應來自網關或代理,此網關或代理在等待另一台伺服器的回應時出現了逾時。
505 HTTP Version not supported。 HTTP協定版本不支援。
【5】簡單說下Apache中rewrite機制和PHP框架中URI路由機制
1)URL重寫,其實就是把用戶通過瀏覽器請求的URL,到了後台,apache根據預先配置的重寫規則將該請求指向真正的資源路徑,說白了就是打馬虎眼,把真正的路徑改頭換面後給用戶訪問,可問題是這樣做有啥用處呢。
1、SEO方面。將動態的URL靜態化,以滿足搜尋引擎的胃口。
2、門禁控制。例如,透過重寫規則後,客戶端不易判斷後台程式類型等。
3、URL重定向。當網站更改網域名稱或增加別名URL後,可以透過規則輕鬆的指向要存取的URL。
mod_rewrite 使用基於正規表示式動態的修改傳入請求的URL。它可以將URL對應到檔案系統路徑,也可以將一個URL對應到另一個URL。它使用了沒有限制數量的規則來操縱URL,每條規則可以包括沒有限制數量的附加條件。你可以透過多種方式來偵測,如,伺服器變數、環境變數、HTTP頭、時間戳記等。
mod_rewrite 操作整個URL路徑,包含path-info的部分。一個重寫規則可以被設定在http.conf或.htaccess中。一個重寫規則產生的路徑可以包括一個請求字串,或者內部的子程序處理,外部請求的重定向,或者穿透內部代理等。
2)PHP框架中的URI路由機制,與apache重寫類似,一般包含通配符和正規兩種規則。讓使用者可以重新定向(remap)URI處理程序. 設定你自己的路由規則。
【6】MySQL的索引機制,複合索引的使用原則
(深入淺出MySQL一書中對索引的使用講的比較細緻)
一般都會用書本中的目錄來介紹索引機制,包括有些書本會有專門的快速檢索附錄,就很類似資料庫的索引。
MySQL的索引包含4類:主鍵索引(primary key)、唯一索引(unique)、常規索引(index)、全文索引(fullindex)。
Show index from table_name; –查看表中的索引
Show status like 'Handler_read%' –查看索引的使用情況
複合索引,一般遵循最左前綴索引
建create index ind_table_a on table_a(a,b,c);
那麼,只有在條件中用到a,或者a、b,或者a、b、c這樣的情況下,才會用到剛建的複合索引。
【7】MySQL的表類型及MyISAM與InnoDB的區別
MySQL常見的表類型(即儲存引擎)
show engines查看支援表類型配置。常見包括:MyISAM/Innodb/Memory/Merge/NDB
其中,MyISAM和Innodb是最常用的兩個表類型,各有優勢,我們可以根據需求情況選擇適合自己的表類型。
[MyISAM]
1)每個資料庫儲存包含3個檔案:.frm(表格定義)、MYD(資料檔案)、MYI(索引檔案)
2)資料檔案或索引檔案可以指向多個磁碟
3)Linux的預設引擎,win預設InnoDB
4)面向非交易類型,避免事務型額外的開銷
5)適用於select、insert密集的表
6)MyISAM預設鎖定的調度機制是寫優先,可以透過LOW_PRIORITY_UPDATES設定
7)MyISAM類型的資料檔案可以在不同作業系統中COPY,這點很重要,佈署的時候方便點。
[Innodb]
1)用於事務應用程式
2)適用於update、delete密集的操作。執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count(*)語句包含 where條件時,兩種表的運算是一樣的。 DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。
3)引入行級鎖定和外鍵的限制
4)InnoDB不支援FULLTEXT類型的索引
【8】簡單說下快速排序演算法
基本思想:透過一趟排序將待排序列分割成兩部分,其中一部分比另一部分記錄小,再分別對這兩部分繼續快速排序,以達到有序。
演算法實現:設有兩個指標low和high,初值為low=1,high=n,設基準值為key(通常選第一個),則先從high位置開始向前搜索,找到第一個比key小的記錄與key交換,然後從low位置向後搜索,找到第一個比key大的記錄與基準值交換,重複直至low=high為止。
第一趟排序結果,key之前的記錄值比key之後的記錄值小。
11 25 9 3 16 2 //選擇11為key
2 25 9 3 16 11
2 11 9 3 16 25
2 3 9 11 9 3 16 25
使用(用實例考察的)[例]:有如下檔案test,請統計每個網址出現次數,用一句shell實現。 a www.baidu.com 20:00 b www.qq.com 19:30 c www.baidu.com 14:0003 e www.qq .com 20:30 f www.360.com 20:30cat test| awk -F' ' '{print $2}' |sort | uniq -c | sort -rn10]sort |的使用與理解Memcached和redis 都是一個key-value的記憶體式儲存系統,透過hash表來儲存檢索結果,做到強大的快取機制。像是新浪的微博、淘寶等大流量站點都必須的使用了這些東東。 下面是從百科摘錄的介紹。具體實踐和使用後續再詳細介紹。 Memcache是一個高效能的分散式的記憶體物件快取系統,透過在記憶體中維護一個統一的巨大的hash表,它能夠用來儲存各種格式的數據,包括圖像、視訊、檔案以及資料庫檢索的結果等。簡單的說就是將資料呼叫到記憶體中,然後從記憶體中讀取,從而大大提高讀取速度。 redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value類型相對更多,包括string(字串)、list(鍊錶)、set(集合)和zset(有序集合)。題外話:
整個面試流程感覺非常nice,覺得面試官都比較隨便的。沒有像別人說的那麼驕傲的。百度的面試是開放式的,整個面試過程中附近都有人在討論問題和方案。