知識(shí)結(jié)構(gòu):
常見的數(shù)據(jù)結(jié)構(gòu)及其實(shí)現(xiàn)
常見的數(shù)據(jù)結(jié)構(gòu)主要有數(shù)組弄痹、鏈表饭入、棧、隊(duì)列肛真、二叉堆圣拄、樹、圖等毁欣,其中棧和隊(duì)列的題目經(jīng)常出現(xiàn)在筆試試卷中,而且實(shí)際算法面試中二叉堆和圖考得很少岳掐,經(jīng)常出現(xiàn)的是數(shù)組凭疮、鏈表和二叉樹這幾種數(shù)據(jù)結(jié)構(gòu)類型的題目
(1) 數(shù)組雖然是最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),但是能考的東西卻非常多串述,例如最常見的排序算法执解、找數(shù)組中第k大的數(shù)字、找兩個(gè)有序數(shù)組的中位數(shù)等
(2) 鏈表因其特殊的結(jié)構(gòu)也是掣傩铮考點(diǎn)衰腌,例如反轉(zhuǎn)鏈表、鏈表元素排序觅赊、合并兩個(gè)有序鏈表右蕊、判斷鏈表是否有環(huán)、有環(huán)的話環(huán)的起點(diǎn)在哪里等
(3) 二叉樹由于其天然的遞歸結(jié)構(gòu)吮螺,是最適合考查遞歸思想的數(shù)據(jù)結(jié)構(gòu)饶囚,例如判斷二叉樹是否平衡、判斷二叉樹是否相同鸠补、判斷二叉樹是否對(duì)稱等
(4) 棧和隊(duì)列也是很重要的數(shù)據(jù)結(jié)構(gòu)萝风,但是它們往往只是作為前期的筆試題,棧經(jīng)常出的題目就是給出一個(gè)棧的入棧序列紫岩,問下面哪個(gè)不可能是這個(gè)棧的出棧序列规惰。棧和隊(duì)列作為算法題并不多,常見的就是如何用兩個(gè)棧來實(shí)現(xiàn)一個(gè)隊(duì)列或者利用一個(gè)輔助棧來將一個(gè)棧中的元素排序
一般來說泉蝌,Android開發(fā)崗位的算法面試是不會(huì)出題要求面試者臨時(shí)設(shè)計(jì)一個(gè)數(shù)據(jù)結(jié)構(gòu)來解決某個(gè)問題歇万,大多數(shù)時(shí)候只是要求面試者能夠熟練掌握常見的數(shù)據(jù)結(jié)構(gòu)及其實(shí)現(xiàn)、能夠說出這種數(shù)據(jù)結(jié)構(gòu)的優(yōu)缺點(diǎn)即可
算法時(shí)間復(fù)雜度的計(jì)算
面試官會(huì)問復(fù)雜度梨与,如果復(fù)雜度較高會(huì)問你有沒有更優(yōu)解堕花。算法的運(yùn)行時(shí)間主要有三種表示符號(hào),但是最常見的就是大O表示法粥鞋。此外缘挽,算法導(dǎo)論中介紹了三種時(shí)間復(fù)雜度的計(jì)算方法,分別是代換法、遞歸樹法和主定理法壕曼。
常見的算法思想苏研,有遞歸、分治腮郊、貪心摹蘑、動(dòng)規(guī)等等
Induction(推導(dǎo))、Recursion(遞歸)轧飞、Reduction(規(guī)約)和Divide and Conquer(分治)衅鹿、貪心、動(dòng)態(tài)規(guī)劃
貪心算法其實(shí)還是比較好想到的过咬,它真正難的是如何證明這個(gè)貪心策略是正確的大渤,建議刷下LeetCode上的貪心題,雖然實(shí)際算法面試中很少出貪心題
動(dòng)規(guī)算法在緊張的算法面試時(shí)并不容易想出來掸绞,個(gè)人感覺就是要多練習(xí)泵三,然后學(xué)會(huì)列出動(dòng)規(guī)的遞推公式,處理好邊界情況衔掸,最后選擇合適的實(shí)現(xiàn)方式去實(shí)現(xiàn)烫幕。實(shí)際算法面試中如果遇到水平較高的面試官是有可能出動(dòng)規(guī)題的,其中最常見的就是最長(zhǎng)公共子序列和最長(zhǎng)遞增子序列等類型的題目
面試準(zhǔn)備:
知識(shí)儲(chǔ)備
基本的數(shù)據(jù)結(jié)構(gòu)敞映、排序算法较曼、時(shí)間復(fù)雜度
數(shù)據(jù)結(jié)構(gòu)在java中的運(yùn)用——集合框架
常見排序刷題
題多時(shí)間少:
常見10種排序、數(shù)組驱显、鏈表诗芜、棧、隊(duì)列埃疫、二叉樹 (集合)基本概念和使用
常見排序算法伏恐、數(shù)據(jù)結(jié)構(gòu)(集合、二叉樹)復(fù)雜度栓霜,一般算法復(fù)雜度的估算
排序算法翠桦、top面試題庫(kù)50題
tips:超過十分鐘直接看答案,用紙筆輔助思考胳蛮,小階段結(jié)束后總結(jié)錯(cuò)誤和題目特點(diǎn)
有強(qiáng)于無销凑,給出暴力解法,和面試官迭溝通改進(jìn)仅炊,這過程本身也是一個(gè)優(yōu)秀的思路
1斗幼、先刷高頻題(數(shù)組、鏈表抚垄、二叉樹等類型題)蜕窿,從探索模塊分類開始或者從簡(jiǎn)單模塊開始谋逻,
2、如果時(shí)間充足再刷自己相對(duì)薄弱的環(huán)節(jié)桐经,插入少量hard擴(kuò)展思路毁兆;
3、如果時(shí)間不充足的話那就直接看題看解答阴挣,可以反復(fù)看反復(fù)記气堕,刷題后按照題目類型分類歸納。有點(diǎn)檔次的企業(yè)也看重解題思路畔咧,且遇到原題機(jī)會(huì)不多茎芭,所以不要硬記答案
4、時(shí)間誓沸,難題三十分鐘骗爆,簡(jiǎn)單題15分鐘之內(nèi),開始練習(xí)時(shí)候?qū)捪拊?0min蔽介,簡(jiǎn)單題25min
有可行但不是最佳方案比木有方案要強(qiáng),一時(shí)想不出最佳方案可以邊寫邊改進(jìn)
5煮寡、有時(shí)間需要安排LeetCode模擬面試
此外:對(duì)于那些經(jīng)典或自己不明白的問題要把收藏起來虹蓄,定期的去回顧這些題目,這樣會(huì)慢慢的加強(qiáng)個(gè)人的思維能力幸撕。
最重要的一點(diǎn)就是要多動(dòng)手去練薇组,別以為一道題目很簡(jiǎn)單,等你寫完提交上去的時(shí)候你會(huì)發(fā)現(xiàn)很多問題坐儿,而我們就是在不斷遇到問題然后去解決的過程中加強(qiáng)自己的能力律胀。
LeetCode上的題解建議放在手機(jī)中,隨時(shí)查看
大神代碼
- 手撕代碼
手寫代碼之前一定要先和面試官溝通好貌矿,確保你完全正確地理解了題目的意思炭菌,想好思路之后再開始寫,否則噼里啪啦寫了一堆沒用而且還有錯(cuò)誤的代碼讓面試官看了會(huì)留下不好的印象逛漫。
在線編程和線下手寫代碼是沒有代碼提示的黑低,所以平時(shí)有必要多練習(xí)手寫代碼,千萬不要犯明顯的基本語法錯(cuò)誤酌毡,同時(shí)要注意代碼風(fēng)格克握,例如代碼格式、變量命名枷踏、函數(shù)命名等菩暗,必要的時(shí)候做些防御性編程以及邊界值檢查等操作。
在沒有直接想出最優(yōu)解的情況下你可以先說出最直觀的暴力解法旭蠕,利用這段時(shí)間慢慢思考有沒有其他的更優(yōu)的解法停团,問面試官能不能給出思路提示旷坦,尊重、傾聽與溝通很重要
- 參考
常見面試算法題匯總一
長(zhǎng)遠(yuǎn)來看客蹋,如何學(xué)好算法
怎樣才能學(xué)好算法
這個(gè)問題回答起來塞蹭,基本上很難。正如回答如何才能學(xué)好C++一樣讶坯。個(gè)人的幾點(diǎn)建議:
首先要學(xué)好數(shù)學(xué)番电,有高等數(shù)學(xué)、高等代數(shù)辆琅、離散數(shù)學(xué)漱办、數(shù)據(jù)結(jié)構(gòu)等方面的基礎(chǔ)。
然后多看一些代碼婉烟,研究它的算法娩井。多練習(xí)一些算法的實(shí)現(xiàn)。
另外似袁,算法是需要經(jīng)驗(yàn)的洞辣,也是一個(gè)很吃基本功的東西,好的算法是在通過扎實(shí)的基本功和潛心的研究得到的昙衅。正如想要下好圍棋扬霜,你需要首先掌握圍棋的基本技法,然后可以先記住一些定式而涉、死活技巧著瓶,最重要是不停的下,從中學(xué)習(xí)經(jīng)驗(yàn)啼县。
最后材原,多看一些趣味題,甚至腦筋急轉(zhuǎn)彎的題目季眷。很多看似和算法無關(guān)的東西其實(shí)都可以影響你的思維方法余蟹,例如36計(jì)。
算法是一種解決問題的思路子刮,算法不用學(xué)客叉,大家都會(huì),因?yàn)榻鉀Q問題的思路大家都有话告,只是有好和壞的區(qū)別罷了 兼搏,我們學(xué)習(xí)算法目的是提高我們思考問題的能力,不說要當(dāng)個(gè)象高斯一樣的數(shù)學(xué)家沙郭,至少要比那些沒學(xué)過算法的人聰明一點(diǎn)點(diǎn)佛呻。
閑扯
如果技術(shù)不能出彩,就展示自己的溝通能力病线,這一是讓面試官覺得很愿意和你合作吓著,二這也是很重要的一項(xiàng)工作技能鲤嫡。