雙非學歷爲進大廠天天刷Java面試題,面試卻履敗,原因竟是算法?

寫在前面

疫情過後,招聘與求職受影響到底有多大?我不知道,但我的真實感受是,即使有疫情的影響,最近還是持續有朋友來跟我說他們今年工作的新動向。有人跳槽去了大廠,有人下定決心出來創業,也有人還在觀望,等待更好的機會。

這位還在“等待更好機會”的朋友,其實已經拿到了幾個 Offer,在我看來都是不錯的方向,待遇也很可觀。但其實,他自己的目標,是頭條一個招聘了很久的崗位。這也能理解,每個程序員都有一個甚至幾個自己的 Dream Company。

我問他既然有目標,爲什麼不行動,你的實力應該也沒問題。他說,“說出來你可能不信,技術面我有信心,但是頭條面試比較注重算法,這是我的短板,所以還得準備準備”。接着他問我,工作中大家實際用到算法的情況不是很多,爲什麼大廠面試一定要考,而且算法考試還都是 Hard 模式。

我想,對於很多人來說,問出來這個問題的時候,已經有答案了。第一,作爲一名合格的程序員,如果你連基礎的算法都學不會,那面試官肯定會懷疑你的智力以及學習能力。第二,工作中處處會用到算法,只是你沒接觸到而已,不信你隨便打開一個開源項目,看看裏面是不是有數據結構與算法的應用場景。

現在大多普通程序員都在面向業務編程,能夠使用現有的語言、框架、操作系統、編譯環境滿足業務需求就可以了,就算不懂算法,也同樣可以完成工作。

然而,在高可用架構、人工智能、雲原生應用、跨平臺框架、區塊鏈這些“高大上”話題頻頻出現的今天,優秀的互聯網企業更願意高薪聘請的,往往是那些能與公司一起,快速跟上時代發展的人。他們熟悉計算機的底層邏輯,他們能夠迅速掌握新技術的核心要領,他們能利用數學、數據結構與算法、計算機組成原理這些基礎知識,提高現有的業務效率,從而創造更可觀的利潤。

換句話說,“僧多粥少”的情況下,企業用“算法面試”這樣的方式,能幫助自己甄別更優秀的人才。

從這個角度,你也就不難理解爲什麼那些大公司面試,都喜歡問算法類的題目了。

今天給大家分享一份京東T8大牛手寫的《數據結構與算法》學習筆記,通過這份學習筆記能夠對算法有一定的瞭解。

《數據結構與算法》學習筆記內容簡介

由於文章篇幅要求簡短,這裏只介紹學習筆記大概包含哪些內容。

想要說明的是,排序算法/數據結構的代碼可能不是最優解,代碼的實現都是以比較容易理解的方式去寫的。幾乎每句代碼都有對應的註釋,應該是能看懂的

筆記內容結構圖

 

一、冒泡排序

冒泡排序(Bubble Sort,臺灣譯爲:泡沫排序或⽓泡排序)是⼀種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因爲越大的元素會經由交換慢慢“浮”到數列的頂端,故名。

 

二、選擇排序

選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始(末尾)位置,直到全部待排序的數據元素排完。選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5後面)

 

三、插入排序

插入排序的基本操作就是將一個數據插入 到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,算法適用於少量數據的排序,時間複雜度爲O(n^2)。 是穩定的排序方法。

 

四、快速排序

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中-部分的所有數據都比另外- -部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

 

五、歸併排序

歸併排序(MERGE-SORT)是建立在歸併操作.上的一種有效的排序算法該算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合井,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲二路歸併。

 

六、希爾排序

希爾排序(Shell's Sort)是插入排序的-種又稱“縮小增量排序”(Diminishing Increment Sort)是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因D.L.Shell於1 959年提出而得名。

 

七、堆排序

堆排序(Heapsort)是指利用堆積樹(堆) 這種數據結構所設計的一種排序算法,它是選擇排序的一種。可以利用數組的特點快速定位指定索引的元素。堆分爲大根堆和小根堆,是完全二叉樹。

 

八、基數排序(桶排序)

基數排序(radix sor)屬於“分配式排序"(distribution sort,又稱"桶子法"(bucket sort)或binsort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些”桶”中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度爲0 (nlog()m),其中r爲所採取的基數,而m爲堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。

 

九、遞歸

遞歸在程序語言中簡單的理解是:方法自2調用自己

遞歸其實和循環是非常像的,循環都可以改寫成遞歸,遞歸未必能改寫成循環,這是-一個充分不必要的條件。

 

十、鏈表

 

十一、棧

 

十二、隊列

 

十三、二叉樹

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章