1. 程式人生 > >360 php 面試總結

360 php 面試總結

public tree 語句 位置 eth spa 退出 系統 保存

一面沒位置就沒做面試題隨便找個了地方面試,一面問了幾個基礎的東西。回答的不是很好 基礎的好多東西都忘了。現在大概整理下

一個面試題:字符串翻轉 寫一個函數 可以把“360安全衛士” 轉成“士衛全安063”

考察字符串編碼問題。 思路:獲取字符串長度 -> for循環截取 ->存入臨時數據 -> 數組反向排序 ->數組轉字符串

echo strlen("360安全衛士") ; //15 不指定編碼的話一個漢字展3個字節

echo mb_srelen("360安全衛士",‘UTF-8‘); //7 UTF-8 一個中文字符當作長度1

function
str_rev_gb($str){ //判斷輸入的是不是utf8類型的字符,否則退出 if(!is_string($str)||!mb_check_encoding($str,‘UTF-8‘)){ exit("輸入類型不是UTF8類型的字符串"); } $array=array(); //將字符串存入數組 $l=mb_strlen($str,‘UTF-8‘);//在mb_strlen計算時,選定內碼為UTF8,則會將一個中文字符當作長度1來計算 for($i=0;$i<$l;$i++){ $array[]=mb_substr($str,$i,1,‘UTF-8‘); }
//反轉字符串 krsort($array); //拼接字符串 $string=implode($array); return $string; }

有一個數組[1,1,3,3,4] 順序數量不定,找出不重復的那個值

php函數 array_count_value()

array_count_values() 函數用於統計數組中所有值出現的次數。

本函數返回一個數組,其元素的鍵名是原數組的值,鍵值是該值在原數組中出現的次數。

數據庫索引的問題

表中USER上建立了索引問一下sql那些能用到索引
select * from table where USER = ‘1‘
select * from table where USER = ‘1‘ or USER =‘2‘
select * from table where USER = ‘1‘ or USER =‘2‘
select * from table where USER LIKE ‘%username‘
select * from table where USER LIKE ‘%username%‘
select * from table where USER LIKE ‘username%‘
select * from table where USER LIKE ‘usern%ame%‘

總結:

1. 為什麽使用索引
在無索引的情況下,MySQL會掃描整張表來查找符合sql條件的記錄,其時間開銷與表中數據量呈正相關。對關系型數據表中的某些字段建索引可以極大提高查詢速度(當然,不同字段是否selective會導致這些字段建立的索引對查詢速度的提升幅度不同,而且索引也並非越多越好,因為寫入或刪除時需要更新索引信息)。
對於MySQL的Innodb儲存引擎來說,大部分類型的index均以B-Tree數據結構的變種B+Tree來存儲(MEMORY類型的表還支持hash類型的索引)。B-Tree是數據庫或文件系統中常用的一種數據結構,它是一種N叉平衡樹,這種樹結構保證了同層節點保存的key有序,對於某個節點來說,其左子樹保存的所有key均小於該節點保存的 key,其右子樹保存的所有key均大於該節點保存的key。此外,在工程實現上,還結合操作系統的局部性原理做了很多優化,總之,b-tree的各種特性或優化技巧能保證:1) 查詢磁盤記錄時,讀盤次數最少;2) 任何insert和delete操作對樹結構的影響均很小;3) 樹本身的rebalance操作很高效。
2. MySQL使用索引的場景


MySQL在以下操作場景下會使用索引:
1) 快速查找符合where條件的記錄
2) 快速確定候選集。若where條件使用了多個索引字段,則MySQL會優先使用能使候選記錄集規模最小的那個索引,以便盡快淘汰不符合條件的記錄。
3) 如果表中存在幾個字段構成的聯合索引,則查找記錄時,這個聯合索引的最左前綴匹配字段也會被自動作為索引來加速查找。
例如,若為某表創建了3個字段(c1, c2, c3)構成的聯合索引,則(c1), (c1, c2), (c1, c2, c3)均會作為索引,(c2, c3)就不會被作為索引,而(c1, c3)其實只利用到c1索引。
4) 多表做join操作時會使用索引(如果參與join的字段在這些表中均建立了索引的話)
5) 若某字段已建立索引,求該字段的min()或max()時,MySQL會使用索引
6) 對建立了索引的字段做sort或group操作時,MySQL會使用索引
3. 哪些SQL語句會真正利用索引
從MySQL官網文檔"Comparison of B-Tree and Hash Indexes"可知,下面這些類型的SQL可能會真正用到索引:
1) B-Tree可被用於sql中對列做比較的表達式,如=, >, >=, <, <=及between操作
2) 若like語句的條件是不以通配符開頭的常量串,MySQL也會使用索引
比如,SELECT * FROM tbl_name WHERE key_col LIKE ‘Patrick%‘或SELECT * FROM tbl_name WHERE key_col LIKE ‘Pat%_ck%‘可以利用索引,而SELECT * FROM tbl_name WHERE key_col LIKE ‘%Patrick%‘(以通配符開頭)和SELECT * FROM tbl_name WHERE key_col LIKE other_col(like條件不是常量串)無法利用索引。
對於形如LIKE ‘%string%‘的sql語句,若通配符後面的string長度大於3,則MySQL會利用Turbo Boyer-Moore algorithm算法進行查找。
3) 若已對名為col_name的列建了索引,則形如"col_name is null"的SQL會用到索引
4) 對於聯合索引,sql條件中的最左前綴匹配字段會用到索引,示例請參考本文第2節第3條對聯合索引的說明
5) 若sql語句中的where條件不只1個條件,則MySQL會進行Index Merge優化來縮小候選集範圍

有一個是類裏屬性權限控制的問題

public 表示全局,類內部外部子類都可以訪問;
private表示私有的,只有本類內部可以使用;
protected表示受保護的,只有本類或子類或父類中可以訪問;

   <?
    //父類
    class father{
     public function a(){
      echo "function a";
     }
     private function b(){
      echo "function b";
     }
     protected function c(){
      echo "function c";
     }
    }
    //子類
    class child extends father{
      function d(){
        parent::a();//調用父類的a方法
      }
      function e(){
       parent::c(); //調用父類的c方法
      }
     function f(){
        parent::b(); //調用父類的b方法
      }
    }
    $father=new father();
    $father->a();
    $father->b(); //顯示錯誤 外部無法調用私有的方法 Call to protected method father::b()
    $father->c(); //顯示錯誤 外部無法調用受保護的方法Call to private method father::c()
    $chlid=new child();
    $chlid->d();
    $chlid->e();
    $chlid->f();//顯示錯誤 無法調用父類private的方法 Call to private method father::b()
    ?>

360 php 面試總結