面試總結1

一、http和https區別php

二、MySQL隔離級別html

三、linux基礎命令java

四、PHP魔術方法mysql

五、php7新特性linux

六、MySQL分區分表nginx

七、MySQL索引原理及查詢優化面試

八、nginx實現負載均衡redis

九、nginx實現反向代理算法

十、反射與映射sql

十一、redis

十二、進程與線程

1三、進程調度

1四、MySQL經常使用數據類型

1五、三次握手和四次揮手

1六、PHP實現原理

1七、設計一個排名榜的設計方案

1八、abcde求子集,必需要包含所有字母,不能有重複

1九、階乘算法

20、12345求子集

2一、編寫shell腳本,讀取  ./path 目錄下全部 .data文件

2二、二叉樹的層級查找

2三、B樹和B+樹

答案:

一、http和https區別

二、MySQL事物及隔離級別:

事物的基本要素:

①原子性(Atomicity):事務開始後全部操做,要麼所有作完,要麼所有不作,不可能停滯在中間環節。事務執行過程當中出錯,會回滾到事務開始前的狀態,全部的操做就像沒有發生同樣。也就是說事務是一個不可分割的總體,就像化學中學過的原子,是物質構成的基本單位。

②一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。好比A向B轉帳,不可能A扣了錢,B卻沒收到。

③隔離性(Isolation):同一時間,只容許一個事務請求同一數據,不一樣的事務之間彼此沒有任何干擾。好比A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉帳。

⑤持久性(Durability):事務完成後,事務對數據庫的全部更新將被保存到數據庫,不能回滾

隔離級別:

①髒讀(未提交讀):事務A讀取了事務B更新的數據,而後B回滾操做,那麼A讀取到的數據是髒數據

②提交讀(不可重複讀):事務 A 屢次讀取同一數據,事務 B 在事務A屢次讀取的過程當中,對數據做了更新並提交,致使事務A屢次讀取同一數據時,結果 不一致。

③幻讀(可重複讀):系統管理員A將數據庫中全部學生的成績從具體分數改成ABCDE等級,可是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺同樣,這就叫幻讀。

④可串行化:是最高的隔離級別。它經過強制事物串行執行,避免了前面說的幻讀問題。簡單來講,serializable會在讀取的每一行數據上都加鎖,因此可能致使大量的超市和鎖爭用的問題。實際應用中也不多用到這個隔離級別,只有在很是須要確保數據的一致性並且能夠接受沒有併發的狀況下,才考慮採用該級別。

三、linux基礎命令

四、PHP魔術方法:

__construct(),類的構造函數

__destruct(),類的析構函數

__call(),在對象中調用一個不可訪問方法時調用

__callStatic(),用靜態方式中調用一個不可訪問方法時調用

__get(),得到一個類的成員變量時調用

__set(),設置一個類的成員變量時調用

__isset(),當對不可訪問屬性調用isset()或empty()時調用

__unset(),當對不可訪問屬性調用unset()時被調用。

__sleep(),執行serialize()時,先會調用這個函數

__wakeup(),執行unserialize()時,先會調用這個函數

__toString(),類被當成字符串時的迴應方法

__invoke(),調用函數的方式調用一個對象時的迴應方法

__set_state(),調用var_export()導出類時,此靜態方法會被調用。

__clone(),當對象複製完成時調用

__autoload(),嘗試加載未定義的類

__debugInfo(),打印所需調試信息

實例:參見詳情

五、PHP7新特性:參考1參考2參考3

六、MySQL分區分表:mysql分表分庫策略

七、MySQL索引原理及查詢優化:MySQL查詢優化

8:nginx實現負載均衡:負載均衡算法nginx實現負載均衡與緩存nginx負載均衡與反向代理

9:nginx實現反向代理:使用nginx實現反向代理

10:反射與映射:Java反射和映射

11:redis:redis面試redis和memcache

12:進程與線程:參見1參見2參見3

1三、進程調度:

①先來先服務

②短做業優先

③高優先權優先調度算法

④高響應比優先調度算法

⑤基於時間片的輪轉

⑥多級反饋隊列調度算法

詳解:進程調度算法Linux進程調度原理

14:MySQL經常使用數據類型

①整數

  

②【定數】小數:decimal(dec)精確小數類型---精確數的存儲

③浮點數:float/double單精度、雙精度浮點類型········

④字符串:

  char(n):固定長度,最多255個字符

  varchar(n):固定長度,最多65535個字符

  tinytext:可變長度,最多255個字符

  text:可變長度,最多65535個字符

  mediumtext:可變長度,最多2的24次方-1個字符

  longtext:可變長度,最多2的32次方-1個字符

⑤日期時間時區:

  date:日期 '2008-12-02'

  time:時間 '12:25:36'

  datetime:日期時間 '2008-12-12 22:06:44'

  timestamp:自動存儲記錄修改時間(若是數據庫裏面有timestamp數據類型,就應該考慮時區問題)

15:三次握手和四次揮手:TCP/IP協議

1六、PHP實現原理

17:設計一個排名榜的設計方案

18:abcde求子集,必需要包含所有字母,不能有重複

function func2($arr, $str){ // $str 爲保存由 i 組成的一個排列狀況
    $cnt = count($arr);
    if($cnt == 1){
        echo $str . $arr[0] . "\n<br>";
    }  else {
        for ($i = 0; $i < count($arr); $i++) {
            $tmp = $arr[0];
            $arr[0] = $arr[$i];
            $arr[$i] = $tmp;
            func2(array_slice($arr, 1), $str . $arr[0]);
        }
    }
}
$a = array('1', '2', '3', '4');
func2($a, '');

 

19:階乘算法

方案一之遞歸:
private static long RecursiveFac(long n){
	 if (n == 0){
		 return 1;
	 }else{
		 return n * RecursiveFac(n - 1);
	 }
}
方案二之遞推:
private static long Fac(long n){
	var result = 1;
	for (var i = 1; i <= n; i++){
		result = result * i;
	}
	return result;
}
方案三之尾遞歸:
private static int TailRecursiveFac(int n, int accumulator){
	if (n == 0){
		return accumulator;
	} 
	return Fac(n - 1, n * accumulator);
}
方案四之消除尾遞歸:
private static int Fac(int n, int accumulator){
	while (true){
		var tempN = n;
		var tempAccumulator = accumulator; 
		if (tempN == 0){
			return tempAccumulator;
		} 
		n = tempN - 1;
		accumulator = tempN * tempAccumulator;
	}
}

20:12345求子集

  public static List<List<Integer>> rank(int[] nums){
        List<Integer>source = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            source.add(nums[i]);
        }
        List<List<Integer>> res = new ArrayList<>();
        for (int i = 0; i < source.size(); i++) {
            List<Integer> tem = new ArrayList<>();
            tem.add(source.get(i));
            if (res.size()>0){
                List<List<Integer>> in = new ArrayList<>();

                for (List<Integer> re : res) {
                    List<Integer> temp = new ArrayList<>(tem);
                    temp.addAll(re);
                    in.add(temp);
                }
                res.addAll(in);
            }
            res.add(tem);
        }
        res.add(new ArrayList<>());
        return res;
    }

2一、編寫shell腳本,讀取  ./path 目錄下全部 .data文件

2二、二叉樹的層級查找

    class TreeNode {
		int val;
		TreeNode left;
		TreeNode right;
		TreeNode(int x) { val = x; }
	}
	
	public static void LaywerTraversal(TreeNode root){
		if(root==null) {
			return;
		}
		LinkedList<TreeNode> list = new LinkedList<TreeNode>();  
		list.add(root);
		TreeNode currentNode;
		while(!list.isEmpty()){
			currentNode=list.poll();
			System.out.println(currentNode.val);
			if(currentNode.left!=null){
				list.add(currentNode.left);
			}
			if(currentNode.right!=null){
				list.add(currentNode.right);
			}
		}
	}

2三、B樹即二叉樹:

  爲何B樹能夠優化查詢:爲何B類樹能夠進行優化呢?咱們能夠根據B類樹的特色,構造一個多階的B類樹,而後在儘可能多的在結點上存儲相關的信息,保證層數儘可能的少,以便後面咱們能夠更快的找到信息,磁盤的I/O操做也少一些,並且B類樹是平衡樹,每一個結點到葉子結點的高度都是相同,這也保證了每一個查詢是穩定的。

  這裏的B樹,也就是英文中的B-Tree,一個 m 階的B樹知足如下條件:

  1. 每一個結點至多擁有m棵子樹;
  2. 根結點至少擁有兩顆子樹(存在子樹的狀況下);
  3. 除了根結點之外,其他每一個分支結點至少擁有 m/2 棵子樹;
  4. 全部的葉結點都在同一層上;
  5. 有 k 棵子樹的分支結點則存在 k-1 個關鍵碼,關鍵碼按照遞增次序進行排列;
  6. 關鍵字數量須要知足ceil(m/2)-1 <= n <= m-1;

  B樹上大部分的操做所須要的磁盤存取次數和B樹的高度是成正比的,在B樹中能夠檢查多個子結點,因爲在一棵樹中檢查任意一個結點都須要一次磁盤訪問,因此B樹避免了大量的磁盤訪問。

爲何須要B+樹:因爲B+樹的數據都存儲在葉子結點中,分支結點均爲索引,方便掃庫,只須要掃一遍葉子結點便可,可是B樹由於其分支結點一樣存儲着數據,咱們要找到具體的數據,須要進行一次中序遍歷按序來掃,因此B+樹更加適合在區間查詢的狀況,因此一般B+樹用於數據庫索引,而B樹則經常使用於文件索引。

  以一個m階樹爲例:

  1. 根結點只有一個,分支數量範圍爲[2,m];
  2. 分支結點,每一個結點包含分支數範圍爲[ceil(m/2), m];
  3. 分支結點的關鍵字數量等於其子分支的數量減一,關鍵字的數量範圍爲[ceil(m/2)-1, m-1],關鍵字順序遞增;
  4. 全部葉子結點都在同一層;

B樹和B+樹的區別:

  這都是因爲B+樹和B具備這不一樣的存儲結構所形成的區別,以一個m階樹爲例。

  1. 關鍵字的數量不一樣;B+樹中分支結點有m個關鍵字,其葉子結點也有m個,其關鍵字只是起到了一個索引的做用,可是B樹雖然也有m個子結點,可是其只擁有m-1個關鍵字。
  2. 存儲的位置不一樣;B+樹中的數據都存儲在葉子結點上,也就是其全部葉子結點的數據組合起來就是完整的數據,可是B樹的數據存儲在每個結點中,並不只僅存儲在葉子結點上。
  3. 分支結點的構造不一樣;B+樹的分支結點僅僅存儲着關鍵字信息和兒子的指針(這裏的指針指的是磁盤塊的偏移量),也就是說內部結點僅僅包含着索引信息。
  4. 查詢不一樣;B樹在找到具體的數值之後,則結束,而B+樹則須要經過索引找到葉子結點中的數據才結束,也就是說B+樹的搜索過程當中走了一條從根結點到葉子結點的路徑。

 

擴展:

獲取樹的深度:

class Bitree {
  int data;
  Bitree left;
  Bitree right;
}
	

private static int BitreeDepth(Bitree p) {
  int rd,ld;
  if(p == null){
  	return 0;
  }else{
	ld=BitreeDepth(p.left);
	rd=BitreeDepth(p.right);
	if(ld>rd){
	  return ld+1;
	}else {
       return rd+1;
	}
  }
}

求e在二叉樹P中的層次。若是不存在返回值爲0;不然返回值爲層次

class Bitree {
	int data;
	Bitree left;
	Bitree right;
}

private static int BitreeLevel(Bitree P,char e) {
	int ld=0;
	int rd=0;
	if(P == null){
		return 0;
	}else if(e==P.data){
                return 1;
	}else if(e!=P.data)	{
		ld=BitreeLevel(P.left,e);
		rd=BitreeLevel(P.right,e);
		if(ld>0){
			return ld+1;
		}else if(rd>0){
			return rd+1;
		}else {
			return 0;
		}
	}
	return ld>rd?ld:rd;
} 
相關文章
相關標籤/搜索