1、給你四個坐標(biāo)點,判斷它們能不能組成一個矩形,如判斷 ([0,0],[0,1],[1,1],[1,0]) 能組成一個矩形。
勾股定理,矩形是對角線相等的四邊形。只要任意三點不在一條直線上,任選一點,求這一點到另外三點的長度的平方,兩個短的之和如果等于最長的,那么這就是矩形。
2、寫一段代碼判斷單向鏈表中有沒有形成環(huán),如果形成環(huán),請找出環(huán)的入口處,即 P 點
/*
*單鏈表的結(jié)點類
*/
class LNode{
? ? //為了簡化訪問單鏈表,結(jié)點中的數(shù)據(jù)項的訪問權(quán)限都設(shè)為public
? ? public int data;
? ? public LNode next;
}
class LinkListUtli {
? ? //當(dāng)單鏈表中沒有環(huán)時返回null,有環(huán)時返回環(huán)的入口結(jié)點
? ? public static LNode searchEntranceNode(LNode L)
? ? {
? ? ? ? LNode slow=L;//p表示從頭結(jié)點開始每次往后走一步的指針
? ? ? ? LNode fast=L;//q表示從頭結(jié)點開始每次往后走兩步的指針
? ? ? ? while(fast !=null && fast.next !=null)
? ? ? ? {
? ? ? ? ? ? if(slow==fast) break;//p與q相等,單鏈表有環(huán)
? ? ? ? ? ? slow=slow.next;
? ? ? ? ? ? fast=fast.next.next;
? ? ? ? }
? ? ? ? if(fast==null || fast.next==null) return null;
? ? ? ? // 重新遍歷,尋找環(huán)的入口點
? ? ? ? slow=L;
? ? ? ? while(slow!=fast)
? ? ? ? {
? ? ? ? ? ? slow=slow.next;
? ? ? ? ? ? fast=fast.next;
? ? ? ? }
? ? ? ? return slow;
? ? }
}
3、寫一個函數(shù),獲取一篇文章內(nèi)容中的全部圖片,并下載
function download_images($article_url = '', $image_path = 'tmp'){
? ? // 獲取文章類容
? ? $content = file_get_contents($article_url);
? ? // 利用正則表達(dá)式得到圖片鏈接
? ? $reg_tag = '/<img.*?\"([^\"]*(jpg|bmp|jpeg|gif|png)).*?>/';
? ? $ret = preg_match_all($reg_tag, $content, $match_result);
? ? $pic_url_array = array_unique($match_result1[1]);
? ? // 創(chuàng)建路徑
? ? $dir = getcwd() . DIRECTORY_SEPARATOR .$image_path;
? ? mkdir(iconv("UTF-8", "GBK", $dir), 0777, true);
? ? foreach($pic_url_array as $pic_url){
? ? ? ? // 獲取文件信息
? ? ? ? $ch = curl_init($pic_url);
? ? ? ? curl_setopt($ch, CURLOPT_HEADER, 0);
? ? ? ? curl_setopt($ch, CURLOPT_NOBODY, 0);
? ? ? ? curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
? ? ? ? curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE );
? ? ? ? curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
? ? ? ? $fileInfo = curl_exec($ch);
? ? ? ? $httpinfo = curl_getinfo($ch);
? ? ? ? curl_close($ch);
? ? ? ? // 獲取圖片文件后綴
? ? ? ? $ext = strrchr($pic_url, '.');
? ? ? ? $filename = $dir . '/' . uniqid() . $ext;
? ? ? ? // 保存圖片信息到文件
? ? ? ? $local_file = fopen($filename, 'w');
? ? ? ? if(false !== $local_file){
? ? ? ? ? ? if( false !== fwrite($local_file, $filecontent) ){
? ? ? ? ? ? fclose($local_file);
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
4、獲取當(dāng)前客戶端的 IP 地址,并判斷是否在
(111.111.111.111,222.222.222.222)
如果沒有使用代理服務(wù)器:
$ip = $_SERVER['REMOTE_ADDR'];
使用透明代理
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
5、nginx 的 log_format 配置如下:
log_format main ‘remoteaddr?remote_user [timelocal]"request”’
‘statusbody_bytes_sent “httpreferer"″"http_user_agent” “upstreamresponsetime""request_time” “http_x_forwarded_for"';
從今天的 nginx log 文件 access.log 中:
a、列出 “request_time” 最大的 20 行?
b、列出早上 10 點訪問量做多的 20 個 url 地址?
6、什么是 CSRF 攻擊?XSS 攻擊?如何防范?
CSRF:跨站請求偽造,可以通過通過判斷來源和加 Token 的方式來防范。
XSS:跨站腳本攻擊,可以通過對內(nèi)容轉(zhuǎn)義和過濾來防范,還有 CSP
7、應(yīng)用中我們經(jīng)常會遇到在 user 表隨機調(diào)取 10 條數(shù)據(jù)來展示的情況,簡述你如何實現(xiàn)該功能。
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;
8、從撲克牌中隨機抽 5 張牌,判斷是不是一個順子,即這 5 張牌是連續(xù)的
這個問題有個關(guān)鍵點,撲克牌,1-13 不能再多了。這就很簡單了。用 PHP 來做,定義一個數(shù)組分別存著 1 到 13, 拿出一個,置空一個,最后看下 這五個置空的 是不是連續(xù)的。這種情況不考慮抽出的順序。
9、兩條相交的單向鏈表,如何求它們的第一個公共節(jié)點
思想:
如果兩個鏈表相交,則從相交點開始,后面的節(jié)點都相同,即最后一個節(jié)點肯定相同;
從頭到尾遍歷兩個鏈表,并記錄鏈表長度,當(dāng)二者的尾節(jié)點不同,則二者肯定不相交;
尾節(jié)點相同,如果 A 長為 LA,B 為 LB,如果 LA>LB, 則 A 前 LA-LB 個先跳過
如果兩個單向鏈表有公共的結(jié)點,也就是說兩個鏈表從某一結(jié)點開始,它們的 m_pNext 都指向同一個結(jié)點。但由于是單向鏈表的結(jié)點,每個結(jié)點只有一個 m_pNext,因此從第一個公共結(jié)點開始,之后它們所有結(jié)點都是重合的,不可能再出現(xiàn)分叉。所以,兩個有公共結(jié)點而部分重合的鏈表,拓?fù)湫螤羁雌饋硐褚粋€ Y,而不可能像 X。
10、最長公共子序列問題 LCS,如有 [1,2,5,11,32,15,77] 和 [99,32,15,5,1,77] 兩個數(shù)組,找到它們共同都擁有的數(shù),寫出時間復(fù)雜度最優(yōu)的代碼,不能用 array_intersect(這里有坑,需要去研究一下動態(tài)規(guī)劃)。
11、linux 的內(nèi)存分配和多線程原理
12、MYSQL 中主鍵與唯一索引的區(qū)別
主鍵:絕對不能有空值。唯一索引:可以有空值
13、http 與 https 的主要區(qū)別
關(guān)鍵是 S 上。簡而言之,https 建立連接后要先把 SSL 的證書發(fā)下去,有了公鑰和私鑰,就可以解密了。
14、http 狀態(tài)碼及其含意
200 請求已成功,請求所希望的響應(yīng)頭或數(shù)據(jù)體將隨此響應(yīng)返回。
301 被請求的資源已永久移動到新位置。
302 請求的資源現(xiàn)在臨時從不同的 URI 響應(yīng)請求。
400 1、語義有誤,當(dāng)前請求無法被服務(wù)器理解。2、請求參數(shù)有誤。
401 當(dāng)前請求需要用戶驗證。
403 服務(wù)器已經(jīng)理解請求,但是拒絕執(zhí)行它。
404 請求失敗,請求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)。
500 服務(wù)器遇到了一個未曾預(yù)料的狀況,無法完成對請求的處理,會在程序碼出錯時出現(xiàn)。
501 服務(wù)器不支持當(dāng)前請求所需要的某個功能。無法識別請求的方法。
502 作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請求時,從上游服務(wù)器接收到無效的響應(yīng)。
503 由于臨時的服務(wù)器維護(hù)或者過載,服務(wù)器當(dāng)前無法處理請求。
15、linux 中怎么查看系統(tǒng)資源占用情況
top、htop、free、uptime
16、SQL 注入的原理是什么?如何防止 SQL 注入
原理:第一 SQL 本身有問題(這個不是主要問題)。第二你寫的 SQL 很有問題(這是最主要的)
防范:第一,絕對不要相信用戶輸入的任何東西。第二,預(yù)編譯。現(xiàn)在的框架一般都會有 SQL 過濾的。
17、isset (null) isset (false) empty (null) empty (false) 輸出
PHP 入門問題,isset 和 empty 的區(qū)別
分別是 false, true, true, true
18、優(yōu)化 MYSQL 的方法
第一,數(shù)據(jù)超過一定數(shù)量或者體積,請拆分表,垂直或者水平分(最有效果的優(yōu)化)
第二,務(wù)必有自增主鍵。通過自增主鍵來查數(shù)據(jù)是最快的。
第三,常用的查詢字段建立聯(lián)合索引,寫 SQL 一定要尊從最左原則,用到這個索引。
第四,不要把邏輯運算放到 sql 里。言外之意是,不要寫太復(fù)雜的 SQL,你能寫復(fù)雜的 SQL 你肯定也能通過 PHP 實現(xiàn)。
19、數(shù)據(jù)庫中的事務(wù)是什么?
事務(wù)(transaction)是作為一個單元的一組有序的數(shù)據(jù)庫操作。如果組中的所有操作都成功,則認(rèn)為事務(wù)成功,即使只有一個操作失敗,事務(wù)也不成功。如果所有操作完成,
事務(wù)則提交,其修改將作用于所有其他數(shù)據(jù)庫進(jìn)程。如果一個操作失敗,則事務(wù)將回滾,該事務(wù)所有操作的影響都將取消。
20、寫一個函數(shù),盡可能高效的從一個標(biāo)準(zhǔn) URL 中取出文件的擴展名
會 寫正則最好。我反正不會正則,需要用的時候就百度。
21、參數(shù)為多個日期時間的數(shù)組,返回離當(dāng)前時間最近的那個時間
遍歷數(shù)組,求當(dāng)前時間差,和第一個進(jìn)行對比,小于第一個交換位置。最后取第一個即可。
22、echo、print、print_r 的區(qū)別
這三個放在一起,回答的點在于,print_r 是函數(shù),echo、print 是結(jié)構(gòu)語言。
23、http 協(xié)議的 header 中有哪些 key 及含義
這個問題,很難。一會半會說不清楚。如果做過 PHP restful 接口開發(fā),也踩過這里面的坑,那應(yīng)該是可以答出來常用的幾個 KEY 的。
24、二叉樹前中后遍歷代碼
層序遍歷
先序遍歷
中序遍歷
后序遍歷
25、PHP 的數(shù)組和 C 語言的數(shù)組結(jié)構(gòu)上有何區(qū)別?
但從 PHP 來講,考的是 PHP 數(shù)組的實現(xiàn)??梢院唵蔚恼J(rèn)為,PHP 的數(shù)組是 hash 桶 + 十字鏈表(實際上是數(shù)列 Array,列表 List,散列表 / 關(guān)聯(lián)數(shù)組 / 字典 Hashtable 的聚合體)。優(yōu)點是查詢效率很高,遍歷很方便,缺點是,占內(nèi)存較多。(還是空間換時間的思路,畢竟現(xiàn)在內(nèi)存又不值錢)
C 語言的數(shù)組,就是定長定類型的數(shù)列。
26、Redis 的跳躍表怎么實現(xiàn)的
跳躍表 (skiplist) 是一種有序數(shù)據(jù)結(jié)構(gòu),它通過在每個節(jié)點中維持多個指向其他節(jié)點的指針,從而達(dá)到快速訪問節(jié)點的目的。
27、哈希是什么?hash 沖突后,數(shù)據(jù)怎么存?
28、聚簇索引,聚集索引的區(qū)別?
29、B+Tree 是怎么進(jìn)行搜索的
30、數(shù)組和 hash 的區(qū)別是什么?
完整的面試題請加群獲取需要的加群(點擊→)677079770