原创 面試解答一:Java基礎,IO,WEB,JVM

Java基礎 String 類爲什麼是 final 的; final 修飾在類上,表示該類不可被繼承 final 修飾在方法上,表示方法不能被重寫 final 修飾在變量上,表示變量需要初始化操作,且引用地址不可變

原创 算法基礎課十六:算法必知必會,面試必考

數組和鏈表 數組實現一個支持動態擴容的數組; 當添加元素,數組已經裝不下更多元素時,進行擴容 每次擴容,創建一個新的,更大的數組,將原數組內容,複製到新數組,並且之後對數組的操作,都是針對新數組 實現一個大小固定的有序

原创 算法基礎課四:排序算法上

排序算法 常用的有:冒泡排序、插入排序、選擇排序、歸併排序、快速排序、計數排序、基數排序、桶排序 時間複雜度: 插入,冒泡,選擇排序:O ( n^2 ) 快排,歸併排序:O ( nlogn ) 桶,計數,基數排序

原创 算法基礎課七:散列表

散列表 散列表,數組演化而來,是將存儲數據的鍵值,通過散列函數,轉換成數組的下標,存儲在數組中,這樣通過鍵值查找數據時,只需根據散列函數,計算得到數組下標,進而得到存儲數據; 散列表,利用數組高效的按下標隨機訪問數據的特性

原创 算法基礎課八:哈希算法

哈希算法 將任意長度的二進制值串,映射爲固定長度的二進制值串,這個映射的規則就是哈希算法,映射的值就是哈希值; 從哈希值不能反向推導出原始數據 原始數據只修改了一個 Bit,新得到哈希值與原哈希值也應該大不相同 散列衝突

原创 算法基礎課二:數組和鏈表

數組結構 線性表結構,每個元素,最多隻有前和後兩個方向,是連續內存空間存儲,要求相同的數據類型; 數組,支持根據下標隨機訪問,時間複雜度爲 O(1),內部是根據 ( 內存首地址 + 下標 * 數據類型所佔空間 ),定位到內

原创 算法基礎課十四:貪心算法和分治算法

貪心算法 如果一組數據,定義了限制值和期望值,希望從中選出幾個數據,在滿足限制值的情況下,期望值最大,然後查看是否存在同等限制值,但對期望值貢獻大的數據,這類問題往往需要考慮貪心算法; 針對上類問題,通過舉幾個例子驗證下,

原创 算法基礎課三:棧和隊列,遞歸算法

棧 只允許在一端操作,且滿足先進後出,後進先出的特性,底層可以使用數組,或者鏈表實現; 計算空間複雜度,是指除了原本的數據存儲空間外,算法運行需要的額外存儲空間; 數組實現的固定大小棧 入棧和出棧的時間複雜度都是

原创 算法基礎課十一:圖和廣度,深度搜索算法

圖的介紹 圖 ( Graph ),是一種複雜的非線性表結構,圖中的元素成爲頂點 ( vertex ),每一個頂點可以與任意其他頂點建立連接關係,這種關係叫作邊 ( edge ),與頂點相連接的邊的條數,稱爲頂點的度 ( degr

原创 算法基礎課十三:Trie 樹和 AC 敏感詞過濾

Trie 樹 也被稱爲字典樹,是一種樹形結構,專門處理字符串匹配,解決在一組字符串集合中,快速查找某個字符串; Trie 樹,利用字符串之間的公共前綴,將重複的前綴合併在一起,如字符串集合 how,hi,her,hello

原创 算法基礎課十:堆和堆排序

堆 堆是一個完全二叉樹,樹中每一個節點的值,都大於等於,或者小於等於其子樹中每個節點的值; 堆分爲大頂堆和小頂堆,因爲是完全二叉樹,所以可以很方便的使用數組存儲,數組下標是按層依次遞增; 堆的插入操作,首先將新插入節

原创 算法基礎課一:複雜度分析

數據結構和算法 數據結構,是指一組數據的存儲結構,算法,是指操作數據的一組方法; 數據結構,是爲算法服務的,算法,作用在特定的數據結構之上; 數據結構和算法,解決的是如何更省,更快地存儲和處理數據,而考量效率和資源消耗

原创 算法基礎課六:二分查找和跳錶

二分查找 針對有序數據的查找算法,每次與集合的中間值進行比較,大於中間值,遞歸在右邊集合中查找,反之從左邊集合中查找,直到查找到元素,或者查找區間被縮小到0; 二分查找,假設區間縮小到最後一個元素才找到,那麼每次縮小區間1

原创 算法基礎課十二:字符串匹配算法

字符串匹配 字符串匹配,即在字符串 A 中查找字符串 B,將字符串 A 稱爲主串,字符串 B 稱爲模式串,n 是主串長度,m 是模式串長度; BF 和 RK 算法 BF 算法,最簡單,暴力的字符串匹配,在主串中,依次從起始

原创 算法基礎課五:排序算法下

桶排序、計數排序、基數排序 時間複雜度都是 O(n),不涉及元素之間的比較操作,但對要排序的數據,有特定的適用要求; 桶排序,首先將要排序的數據分到幾個有序的桶裏,每個桶裏的數據再單獨進行排序,桶內排完序之後,再把每個桶裏