前言
現在越來越多的人應聘工作時都得先刷個幾十百來道題,不刷題感覺都過不了面試。
無論是前后端、移動開發,好像都得刷題,這么多人通過刷題過了面試,說明刷題對於找工作還是有幫助的。
不過這其中有一個問題:很多人雖然為了找工作刷了題,但是卻不理解公司為何要采取這樣的方式來考察求職者。還有很多人為此憤憤不平:“我一個架構、移動開發工程師,你不問我項目經驗、開發經驗,反而來問我算法題,玩呢?”
是的,仔細想想確實是這樣,由於應屆生沒有工作項目經驗,所以面試的時候多問一些算法題可以理解。但是對於一個工作好幾年的老程序員,在工作中已經很少手寫算法了,更多的優勢是項目經驗,在面試中同樣讓手寫一些算法,如常見的十大排序、查找等基本算法,是不是有些偏題?
真的是這樣嗎?
其實多數情況下,一般抱怨面試只問算法題的人,都是在面試中沒有寫出相關算法的人。企業也並不是只問算法,而不問項目、系統設計等知識,知識他還沒有面到那一步就跪了。
企業的面試有好幾輪,一般剛開始都是寫題,如果通過了,接下來才會問簡歷。那些懷才不遇的“老鳥們”,一般都是沒有刷夠題,所以在面試中提前出局了。
這種面試方式會讓企業錯過真正牛逼的程序員嗎?比如那種經驗豐富、實戰性強的牛人?
一般情況下是不會的,因為目前的互聯網行業從業人員太多太多了,基數大,優秀的人也特別多。比如有100個人面試,企業只招聘10個,那么你排在11名也是不行的,因為企業一定是能找出來那種:算法題搞得很厲害,工作經驗也豐富,各方面都很優秀的人!
在這種情況下,即使你的開發能力很好,工作經驗特別豐富,架構設計能力也很強,企業也能找到一個其他各方面條件和你差不多,但是刷題也棒的人。
還記得好多年前,會開車也是一項很厲害的技能,那時候汽車還不是特別普及,能在早期拿到駕駛證的人,去給別人開貨車、當司機,都能拿到一份不錯的薪資,而現在呢?幾乎人人都會開車了。
在一個行業剛開始發展的時候,總會有紅利期的。比如淘寶的紅利期、自媒體的紅利期,互聯網行業也會有紅利期。
2000年左右的時候,軟件工程師特別少,想要進入企業寫代碼,難度也不算大,並且工資也非常高,在北京一個月能拿到4000-5000元,而當時北京的房價是幾千元一平,那時的軟件工程師大多都在北京買房了,享受了互聯網的紅利。
到了2021年的今天,互聯網發展到現在,也相對成熟了,從業人員也越來越多,從大學計算機專業的分數線也能看出來這個趨勢。我高考填報的志願是建築、機械工程、車輛工程這些當時的熱門專業,然而被調劑到了當時冷門的計算機專業。而等到我畢業的時候,計算機專業的分數已經領先我入校那會兒的一些熱門專業高幾十分了。
由於互聯網行業的薪資高、能掙錢,吸引了大批人涌入,高中畢業生填報相關專業,大學期間還有很多其他專業的人轉專業過來,很多考研的同學也紛紛跨考,導致近幾年從業人員暴增,競爭十分激烈。
軟件工程師越來越多,優秀的軟件工程師也越來越多,大家不愁找不到優秀的人。所以把算法題作為一個門檻了。
怎么驗證你算法的能力呢?
先看看以下這些大廠必考經典題👇
- 請問,Object作為HashMap的key的話,對Object有什么要求嗎?
- 請問 hashset 存的數是有序的嗎?
- 輸入一個二叉樹和一個整數,打印出二叉樹中節點值的和等於輸入整數所有的路徑
- 二叉樹的搜索區間
- 現在有一個單向鏈表,談一談,如何判斷鏈表中是否出現了環
- 隨機鏈表的復制
- 找出數組中和為S的一對組合,找出一組就行
- 求一個數組中連續子向量的最大和
- 談一談,如何得到一個數據流中的中位數?
- 你知道哪些排序算法,這些算法的時間復雜度分別是多少,解釋一下快排?
- 請你解釋一下,內存中的棧(stack)、堆(heap) 和靜態區(static area) 的用法。
- 說一說,heap和stack有什么區別。
- 請你設計一個算法,用來壓縮一段URL?
- 談一談,id全局唯一且自增,如何實現?
- 一個長度為N的整形數組,數組中每個元素的取值范圍是[0,n-1],判斷該數組否有重復的數,請說一下你的思路並手寫代碼
- 請問求第k大的數的方法以及各自的復雜度是怎樣的,另外追問一下,當有相同元素時,還可以使用什么不同的方法求第k大的元素
- 判斷一個鏈表是否為回文鏈表,說出你的思路並手寫代碼
...
懵逼了嗎?你能答出幾道?別着急,刷題也有刷題的方法, Leetcode 內容復雜、網上資料良莠不齊,想要靠自己梳理清楚確實不容易,為了幫助大家順利挺進大廠,我們研究了各個大廠的面試題型,總結出這「 100 道大廠算法必考面試題+詳細解答」
1.哈希
- 請說⼀說,Java中的HashMap的⼯作原理是什么?
- 介紹⼀下,什么是Hashmap?
- 講⼀講,如何構造⼀致性哈希算法。
- 請談⼀談,hashCode() 和equals() ⽅法的重要性體現在什么地⽅?
2.⼆叉樹
- 求⼆叉樹的最⼤深度
- 求⼆叉樹的最⼩深度
- 求⼆叉樹中節點的個數
- 求⼆叉樹中葉⼦節點的個數
- 求⼆叉樹中第k層節點的個數
- 判斷⼆叉樹是否是平衡⼆叉樹
- 判斷⼆叉樹是否是完全⼆叉樹
- 兩個⼆叉樹是否完全相同
- 翻轉⼆叉樹or鏡像⼆叉樹
- 兩個⼆叉樹是否互為鏡像
- 求兩個⼆叉樹的最低公共祖先節點
3.鏈表
- 談⼀談,bucket如果⽤鏈表存儲,它的缺點是什么?
- 有⼀個鏈表,奇數位升序偶數位降序,如何將鏈表變成升序?
- 如何反轉單鏈表
- 現在有⼀個單向鏈表,談⼀談,如何判斷鏈表中是否出現了環
- 隨機鏈表的復制
4.數組
- 寫⼀個算法,可以將⼀個⼆維數組順時針旋轉90度。
- ⼀個數組,除⼀個元素外其它都是兩兩相等,求那個元素?
- 找出數組中和為S的⼀對組合,找出⼀組就⾏
- 求⼀個數組中連續⼦向量的最⼤和
- 尋找⼀數組中前K個最⼤的數
5.排序
- ⽤Java寫⼀個冒泡排序?
- 介紹⼀下,排序都有哪⼏種⽅法?請列舉出來
- 介紹⼀下,歸並排序的原理是什么?
- 介紹⼀下,堆排序的原理是什么?
- 談⼀談,如何得到⼀個數據流中的中位數
- 你知道哪些排序算法,這些算法的時間復雜度分別是多少,解釋⼀下快排?
6.堆與棧
- 請你解釋⼀下,內存中的棧(stack)、堆(heap) 和靜態區(static area) 的⽤法。
- 說⼀說,heap和stack有什么區別。
- 最⼩的k個數
- 滑動窗⼝最⼤值
- 丑數前
- 前K個⾼頻元素
- 有效的括號
- 最⼩棧
- 柱狀圖中最⼤的矩形
7.⾼級算法
- 請你講講LRU算法的實現原理?
- 為什么要設計 后綴表達式,有什么好處?
- 請你設計⼀個算法,⽤來壓縮⼀段URL?
- 談⼀談,id全局唯⼀且⾃增,如何實現?
- 最后⼀個單詞的⻓度
8.動態規划
- 斐波那契數
- 不同路徑
- 爬樓梯
- 零錢兌換
- 打家劫舍
- 編輯距離
由於篇幅限制,展示了部分內容截圖,需要這些文檔資料的,可以點贊支持一下我,然后【點擊這里】免費閱讀下載哦
希望所有的程序員都能夠學習起來,努力實現我們的大廠夢!