一、給你四個座標點,判斷它們能不能組成一個矩形,如判斷 ([0,0],[0,1],[1,1],[1,0]) 能組成一個矩形。php
咱們分析這道題, 給4個標點,判斷是否矩形mysql
高中知識,矩形有4條邊,兩兩相等, 矩形兩條對角線相等, 矩形的長短邊與對角線知足勾股定理。linux
故解題思路爲,根據座標點,nginx
列出全部的兩點組合邊長的數組,去重,看是否是隻剩 3個長度(注意正方形2個長度)laravel
判斷是否知足勾股定理面試
調優一下,先判斷有沒有重複的點,有的話確定不是矩形正則表達式
代碼以下:redis
<?php function isRectangle($point1, $point2, $point3, $point4){ if ($point1 == $point2 || $point1 == $point3 || $point1 == $point4 || $point2 == $point3 || $point2 == $point4 || $point3 == $point4) { return false; } $lengthArr = []; $lengthArr[] = getLengthSquare($point1, $point2); $lengthArr[] = getLengthSquare($point1, $point3); $lengthArr[] = getLengthSquare($point1, $point4); $lengthArr[] = getLengthSquare($point2, $point3); $lengthArr[] = getLengthSquare($point2, $point4); $lengthArr[] = getLengthSquare($point3, $point4); $lengthArr = array_unique($lengthArr); $lengthCount = count($lengthArr); if ($lengthCount == 3 || $lengthCount == 2 ) { if ($lengthCount == 2) { return(max($lengthArr) == 2*min($lengthArr)); } else { $maxLength = max($lengthArr); $minLength = min($lengthArr); $otherLength = array_diff($lengthArr, [$maxLength, $minLength]); return($minLength + $otherLength == $maxLength); } } else { return false; } } function getLengthSquare($point1, $point2){ $res = pow($point1[0]-$point2[0], 2)+pow($point1[1]-$point2[1], 2); return $res; } var_dump(isRectangle([0,0],[0,2],[2,2],[2,0]));
二、寫一段代碼判斷單向鏈表中有沒有造成環,若是造成環,請找出環的入口處,即 P 點算法
/* *單鏈表的結點類 */ class LNode{ //爲了簡化訪問單鏈表,結點中的數據項的訪問權限都設爲public public int data; public LNode next; } class LinkListUtli { //當單鏈表中沒有環時返回null,有環時返回環的入口結點 public static LNode searchEntranceNode(LNode L) { LNode slow=L;//p表示從頭結點開始每次日後走一步的指針 LNode fast=L;//q表示從頭結點開始每次日後走兩步的指針 while(fast !=null && fast.next !=null) { if(slow==fast) break;//p與q相等,單鏈表有環 slow=slow.next; fast=fast.next.next; } if(fast==null || fast.next==null) return null; // 從新遍歷,尋找環的入口點 slow=L; while(slow!=fast) { slow=slow.next; fast=fast.next; } return slow; } }
三、寫一個函數,獲取一篇文章內容中的所有圖片,並下載sql
function download_images($article_url = '', $image_path = 'tmp'){ // 獲取文章類容 $content = file_get_contents($article_url); // 利用正則表達式獲得圖片連接 $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]); // 建立路徑 $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); } } } }
四、獲取當前客戶端的 IP 地址,並判斷是否在(111.111.111.111,222.222.222.222)
若是沒有使用代理服務器:
$ip = $_SERVER['REMOTE_ADDR'];
使用透明代理
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
五、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 中:
六、什麼是 CSRF 攻擊?XSS 攻擊?如何防範?
CSRF:跨站請求僞造,能夠經過經過判斷來源和加 Token 的方式來防範。
XSS:跨站腳本攻擊,能夠經過對內容轉義和過濾來防範,還有 CSP
七、應用中咱們常常會遇到在 user 表隨機調取 10 條數據來展現的狀況,簡述你如何實現該功能。
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;
八、從撲克牌中隨機抽 5 張牌,判斷是否是一個順子,即這 5 張牌是連續的
這個問題有個關鍵點,撲克牌,1-13 不能再多了。這就很簡單了。用 PHP 來作,定義一個數組分別存着 1 到 13, 拿出一個,置空一個,最後看下 這五個置空的 是否是連續的。這種狀況不考慮抽出的順序。
九、兩條相交的單向鏈表,如何求它們的第一個公共節點
思想:
若是兩個單向鏈表有公共的結點,也就是說兩個鏈表從某一結點開始,它們的 m_pNext 都指向同一個結點。但因爲是單向鏈表的結點,每一個結點只有一個 m_pNext,所以從第一個公共結點開始,以後它們全部結點都是重合的,不可能再出現分叉。因此,兩個有公共結點而部分重合的鏈表,拓撲形狀看起來像一個 Y,而不可能像 X。
十、最長公共子序列問題 LCS,若有 [1,2,5,11,32,15,77] 和 [99,32,15,5,1,77] 兩個數組,找到它們共同都擁有的數,寫出時間複雜度最優的代碼,不能用 array_intersect(這裏有坑,須要去研究一下動態規劃)。
十一、linux 的內存分配和多線程原理
十二、MYSQL 中主鍵與惟一索引的區別
主鍵:絕對不能有空值。惟一索引:能夠有空值
1三、http 與 https 的主要區別
關鍵是 S 上。簡而言之,https 創建鏈接後要先把 SSL 的證書發下去,有了公鑰和私鑰,就能夠解密了。
1四、http 狀態碼及其含意
1五、linux 中怎麼查看系統資源佔用狀況
top、htop、free、uptime
1六、SQL 注入的原理是什麼?如何防止 SQL 注入
原理:第一 SQL 自己有問題(這個不是主要問題)。第二你寫的 SQL 頗有問題(這是最主要的)
防範:第一,絕對不要相信用戶輸入的任何東西。第二,預編譯。如今的框架通常都會有 SQL 過濾的。
1七、isset (null) isset (false) empty (null) empty (false) 輸出
PHP 入門問題,isset 和 empty 的區別
分別是 false, true, true, true
1八、優化 MYSQL 的方法
第一,數據超過必定數量或者體積,請拆分表,垂直或者水平分(最有效果的優化)
第二,務必有自增主鍵。經過自增主鍵來查數據是最快的。
第三,經常使用的查詢字段創建聯合索引,寫 SQL 必定要尊從最左原則,用到這個索引。
第四,不要把邏輯運算放到 sql 裏。言外之意是,不要寫太複雜的 SQL,你能寫複雜的 SQL 你確定也能經過 PHP 實現。
1九、數據庫中的事務是什麼?
事務(transaction)是做爲一個單元的一組有序的數據庫操做。若是組中的全部操做都成功,則認爲事務成功,即便只有一個操做失敗,事務也不成功。若是全部操做完成,
事務則提交,其修改將做用於全部其餘數據庫進程。若是一個操做失敗,則事務將回滾,該事務全部操做的影響都將取消。
20、寫一個函數,儘量高效的從一個標準 URL 中取出文件的擴展名
會 寫正則最好。我反正不會正則,須要用的時候就百度。
2一、參數爲多個日期時間的數組,返回離當前時間最近的那個時間
遍歷數組,求當前時間差,和第一個進行對比,小於第一個交換位置。最後取第一個便可。
2二、echo、print、print_r 的區別
這三個放在一塊兒,回答的點在於,print_r 是函數,echo、print 是結構語言。
至於他們具體的區別參考:https://www.cnblogs.com/xiaotaoing/p/66873...
2三、http 協議的 header 中有哪些 key 及含義
這個問題,很難。一會半會說不清楚。若是作過 PHP restful 接口開發,也踩過這裏面的坑,那應該是能夠答出來經常使用的幾個 KEY 的。
2四、二叉樹前中後遍歷代碼
2五、PHP 的數組和 C 語言的數組結構上有何區別?
但從 PHP 來說,考的是 PHP 數組的實現。能夠簡單的認爲,PHP 的數組是 hash 桶 + 十字鏈表(其實是數列 Array,列表 List,散列表 / 關聯數組 / 字典 Hashtable 的聚合體)。優勢是查詢效率很高,遍歷很方便,缺點是,佔內存較多。(仍是空間換時間的思路,畢竟如今內存又不值錢)
C 語言的數組,就是定長定類型的數列。
2六、Redis 的跳躍表怎麼實現的
跳躍表 (skiplist) 是一種有序數據結構,它經過在每一個節點中維持多個指向其餘節點的指針,從而達到快速訪問節點的目的。
2七、哈希是什麼?hash 衝突後,數據怎麼存?
2八、聚簇索引,彙集索引的區別?
2九、B+Tree 是怎麼進行搜索的
30、數組和 hash 的區別是什麼?
3一、寫個函數,判斷下面擴號是否閉合,左右對稱即爲閉合: ((())),)(()),(()))),(((((()),(()()),()()
3二、 找出數組中不重複的值 [1,2,3,3,2,1,5]
用普通方法,確定很容易的。
3三、32 題你的時間複雜度是多少?有的狀況下,你寫了個算法,而後面試官會讓你把你的算法的時間複雜度表達式寫出來
3四、PHP 的的這種弱類型變量是怎麼實現的?
考 zval 的,PHP 的八種類型,本質只有一個結構。
3五、在 HTTP 通信過程當中,是客戶端仍是服務端主動斷開鏈接?
三次握手和四次揮手,以及他們每步的狀態。
這個問題最好能一步到位回答的全面的。通常都是有客戶端告訴服務端,我這邊東西發完了,能夠斷鏈接了麼。可是若是客戶端發完 FIN 服務端沒有回覆,就會重試,直到超過超時時間,就斷了。服務端也同樣,超過期間,服務端就斷了。
3六、PHP 中發起 http 請求有哪幾種方式?它們有何區別?
3七、有一顆二叉樹,寫代碼找出來從根節點到 flag 節點的最短路徑並打印出來,flag 節點有多個。好比下圖這個樹中的 6 和 14 是 flag 節點,請寫代碼打印 八、三、6 和 八、十、14 兩個路徑
典型的二叉搜索樹。大學數據結構的基礎題。
3八、有兩個文件文件,大小都超過了 1G,一行一條數據,每行數據不超過 500 字節,兩文件中有一部份內容是徹底相同的,請寫代碼找到相同的行,並寫到新文件中。PHP 最大容許內內爲 255M。
將文件拆分紅若干個小文件,根據內容計算 hash 值,分散到不一樣文件。
3九、請寫出自少兩個支持回調處理的 PHP 函數,並本身實現一個支持回調的 PHP 函數
array_map,array_filter, array_walk
40、請寫出自少兩個獲取指定文件夾下全部文件的方法(代碼或思路)。
核心方法是 scandir, 核心思想是遞歸。
4一、請寫出自少三種截取文件名後綴的方法或函數(PHP 原生函數和本身實現函數都可)
echo substr(strrchr($file, '.'), 1); echo substr($file, strrpos($file, '.')+1); $arr=explode('.', $file); echo $arr[count($arr)-1]; $arr=explode('.', $file); echo end($arr); echo strrev(explode('.', strrev($file))[0]); echo pathinfo($file)['extension']; echo pathinfo($file, PATHINFO_EXTENSION);
4二、PHP 如何實現不用自帶的 cookie 函數爲客戶端下發 cookie。對於分佈式系統,如何來保存 session 值。
這個題有點繞。考的仍是 COOKIE 和 SESSION 的基礎知識。服務端經過 set-cookie 命令來通知客戶端保存 cookie。
只要按照 domain path 過時時間等規則 用 header 函數就能夠實現。
分佈式系統 session,集中處理。按咱們公司的架構,爲了實現高可用和高容災,提供一個分佈式的驗籤服務。具體的能夠看下 redis 的分佈式服務架構。
4三、請用 SHELL 統計 5 分鐘內,nginx 日誌裏訪問最多的 URL 地址,對應的 IP 是哪些?
4四、寫一段 shell 腳本實現備份 mysql 指定庫(如 test) 到指定文件夾並打包,並刪除 30 天前的備份,而後將新的備份推送到遠端服務器,完成後送郵件通知。
4五、mysql 數據庫中 innodb 和 myisam 引擎的區別
區別主要在數據和索引的存儲結構和存儲方式上,以及對於事務的支持。
4六、從用戶在瀏覽器中輸入網址並回車,到看到完整的見面,中間都經歷了哪些過程。
入門問題。這個問題有一個很大的坑,面試官可能會從這個問題下手問你一大堆問題。
以 PHP 爲例:一般最簡單的回答,從用戶的電腦找到最近的 DNS 服務,而後解析到對應的 IP 而後雙方開始 HTTP 鏈接,而後發送請求信息,服務器拿到請求信息就開始準備迴應的信息,中間要通過 nginx 轉發到 frstCGI (PHP-FPM), 而後 PHP 開始解析框架,解析請求頭部,找到對應的 API,該查數據庫查數據,該組裝 HTML 組裝 HTML,完事了就從新返回給用戶。用戶拿到返回數據,瀏覽器開始渲染頁面,JS 開始加載。
4七、如何分析一條 sql 語句的性能。
explain,具體的請百度。(基本不多用性能分析語句。MYSQL 的表設計上儘可能冗餘一部分字段,避免在 MYSQL 裏處理大量的邏輯運算。咱們是作 PHP 服務開發的,mysql 語句能簡單儘可能簡單。邏輯運算的地方能夠在 PHP 裏作。)
4八、ping 一個服務器 ping 不通,用哪一個命令跟蹤路由包?
linux:traceroute,windows:tracert
4九、$a=[0,1,2,3]; $b=[1,2,3,4,5]; $a+=$b; var_dump ($a) 等於多少?
基礎問題。本質仍是考 PHP 數組的結構和特色。
結果是 01235。PHP 用數字索引和 STRING 索引差異仍是很大的
50、$a=[1,2,3]; foreach ($a as &$v){} foreach ($a as $v){} var_dump ($a) 等於多少;
122
此處有一坑。foreach 完以後,$index , $value 並不會消失保留最後一次賦值。
這裏的第一次 foreach 以後,數組中最後一個元素變成引用,引用變量 $v 繼續存在且指向數組的最後一個元素。第二次遍歷,由於遍歷變量名是 $v , 因此等於說每次遍歷都將這次遍歷的值修改爲最後元素的值,直至到遍歷最後一個元素(引用元素),由於此時數組的最後一個元素已被修改爲上一個元素的值,最後一次賦值就是 本身 == 本身。 故最後一個等於倒數第二個
更多學習內容能夠訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)
以上內容但願幫助到你們,不少PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提高,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨須要的能夠免費分享給你們,須要的能夠加入個人PHP技術交流羣953224940