程序員必備的50道數(shù)據(jù)結(jié)構(gòu)和算法面試題

數(shù)組問題

數(shù)組是最常用的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)呈驶,它將元素保存在連續(xù)的內(nèi)存中。它也是面試最喜歡的問題之一疫鹊,在代碼面試中你會(huì)經(jīng)常聽到很多關(guān)于數(shù)組的問題袖瞻,例如,數(shù)組的反轉(zhuǎn)拆吆、數(shù)組的排序或者查找數(shù)組中的一個(gè)元素聋迎。

數(shù)組結(jié)構(gòu)的一個(gè)關(guān)鍵優(yōu)點(diǎn)是在知道索引的情況能夠以 O(1) 的復(fù)雜度找到一個(gè)元素。但是增加或者刪除一個(gè)元素是很慢的枣耀,因?yàn)橐坏﹦?chuàng)建了一個(gè)數(shù)組霉晕,你就不能改變它的大小了。

為了創(chuàng)建一個(gè)更長(zhǎng)或者更短的數(shù)組捞奕,你需要?jiǎng)?chuàng)建一個(gè)新的數(shù)組牺堰,然后將所有元素從舊數(shù)組中復(fù)制到新數(shù)組中。

解決數(shù)組問題的關(guān)鍵是颅围,你要對(duì)數(shù)組這種數(shù)據(jù)結(jié)構(gòu)有一個(gè)深刻的認(rèn)識(shí)伟葫,同時(shí)還要了解基本的程序流程如循環(huán)、遞歸以及基本的操作符院促。

下面是一些經(jīng)常問到和數(shù)組相關(guān)的面試題扒俯,你可以拿來練習(xí):

1、在一個(gè)給定的從1到100的整型數(shù)組中一疯,如何快速找到缺失的數(shù)字撼玄?

2、如何找到一個(gè)給定的整型數(shù)組中的重復(fù)數(shù)字墩邀?

3掌猛、在一個(gè)未排序的整型數(shù)組中,如何找到最大和最小的數(shù)字眉睹?

4荔茬、在一個(gè)整型數(shù)組中,如何找到一個(gè)所有成對(duì)的數(shù)字,滿足它們的和等于一個(gè)給定的數(shù)字碰酝?

5余爆、如果一個(gè)數(shù)組包含多個(gè)重復(fù)元素,如何找到這些重復(fù)的數(shù)字孔飒?

6灌闺、用 Java 實(shí)現(xiàn)從一個(gè)給定數(shù)組中刪除重復(fù)元素?

7坏瞄、如何利用快速排序?qū)σ粋€(gè)整型數(shù)組進(jìn)行排序桂对?

8、如何從一個(gè)數(shù)組中刪除重復(fù)元素鸠匀?

9蕉斜、用 Java 實(shí)現(xiàn)數(shù)組反轉(zhuǎn)?

10缀棍、如何不借助庫實(shí)現(xiàn)從數(shù)組中刪除重復(fù)元素宅此?

鏈表問題

鏈表是另外一個(gè)常見的數(shù)據(jù)結(jié)構(gòu),對(duì)數(shù)組結(jié)構(gòu)是一個(gè)補(bǔ)充爬范。和數(shù)組類似父腕,它也是一個(gè)線性的數(shù)據(jù)結(jié)構(gòu),以線性方式存儲(chǔ)元素坦敌。

不過和數(shù)組不同的是侣诵,鏈表的元素不是存儲(chǔ)在連續(xù)位置中,而是分散在各個(gè)內(nèi)存中的各個(gè)位置狱窘,通過節(jié)點(diǎn)鏈接起來杜顺。一個(gè)鏈表就是一個(gè)包含了下個(gè)節(jié)點(diǎn)內(nèi)存地址的節(jié)點(diǎn)列表。

基于這種結(jié)構(gòu)蘸炸,可以很容易實(shí)現(xiàn)鏈表中元素的添加和刪除躬络,因?yàn)橹恍枰淖児?jié)點(diǎn)的指向而無需創(chuàng)建一個(gè)新的數(shù)組。不過鏈表中的查找是相對(duì)困難的搭儒,在一個(gè)單向鏈表中需要花費(fèi) O(n) 的時(shí)間代價(jià)來查找一個(gè)元素穷当。

鏈表有幾種不同的形式。首先是單向鏈表淹禾,在這個(gè)結(jié)構(gòu)你只能向一個(gè)方向遍歷(向前或者反轉(zhuǎn))馁菜;其次是雙向鏈表,你可以雙向遍歷(向前或者向后)铃岔;最后是環(huán)形鏈表汪疮,組成一個(gè)環(huán)的形式。

要解決鏈表問題毁习,你就必須了解遞歸的相關(guān)知識(shí)智嚷,因?yàn)殒湵硎且环N遞歸的數(shù)據(jù)結(jié)構(gòu)。如果你從鏈表中去掉一個(gè)節(jié)點(diǎn), 剩下的數(shù)據(jù)結(jié)構(gòu)仍然是鏈表纺且,因此, 許多鏈表問題有比遍歷更簡(jiǎn)單的遞歸解決方案.

下面是一些最常見和流行的鏈表面試問題

1盏道、在一次遍歷中,怎樣發(fā)現(xiàn)單個(gè)鏈表的中間元素?

2载碌、怎樣驗(yàn)證給定的鏈表是環(huán)形的? 怎樣發(fā)現(xiàn)這個(gè)環(huán)的起始節(jié)點(diǎn)?

3猜嘱、怎樣翻轉(zhuǎn)鏈表?

4衅枫、不使用遞歸,怎樣反轉(zhuǎn)單個(gè)鏈表?

5泉坐、在未排序鏈表中为鳄,怎樣移除重復(fù)的節(jié)點(diǎn)?

6裳仆、怎樣找出單個(gè)鏈表的長(zhǎng)度?

7腕让、從單個(gè)鏈表的結(jié)尾處,怎樣找出鏈表的第三個(gè)節(jié)點(diǎn)?

8歧斟、怎樣使用棧計(jì)算兩個(gè)鏈表的和?

字符串相關(guān)問題

與數(shù)組和鏈表數(shù)據(jù)結(jié)構(gòu)一起纯丸,字符串是編程工作面試中的另一個(gè)熱門話題。我從未參加過沒有問過基于字符串相關(guān)問題的編碼面試静袖。

字符串的一個(gè)優(yōu)勢(shì)在于觉鼻,如果你了解數(shù)組,你可以很容易地解決基于字符串的問題队橙,因?yàn)樽址畠H僅是一個(gè)字符數(shù)組坠陈。

因此,在解決基于數(shù)組的編程問題中所學(xué)到的所有技術(shù)也可用于解決字符串編程問題捐康。

以下是編程求職面試中常見的字符串編程問題:

1仇矾、如何輸出字符串中的重復(fù)字符?

2解总、如何判斷兩個(gè)字符串是否互為回文贮匕?

3、如何從字符串中輸出第一個(gè)不重復(fù)字符花枫?

4刻盐、如何使用遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)?

5、如何檢查字符僅包含數(shù)字字符劳翰?

6敦锌、如何在字符串中找到重復(fù)字符?

7佳簸、如何對(duì)給定字符串中的元音及輔音進(jìn)行計(jì)數(shù)乙墙?

8、如何計(jì)算給定字符傳中特定字符出現(xiàn)的次數(shù)溺蕉?

9伶丐、如何找到一個(gè)字符串的全排列?

10疯特、在不使用任何庫方法的情況下如何反轉(zhuǎn)給定語句中的單詞哗魂?

11、如何判斷兩個(gè)字符串是否互為旋轉(zhuǎn)漓雅?

12录别、如何判斷給定字符串是否是回文朽色?

二叉樹問題

到目前為止,我們只研究了線性數(shù)據(jù)結(jié)構(gòu)组题,但現(xiàn)實(shí)世界中的所有信息無法全部使用線性方式表示葫男,而這正是樹數(shù)據(jù)結(jié)構(gòu)所擅長(zhǎng)的地方。

樹是一種支持以分層方式存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)崔列。根據(jù)你存儲(chǔ)數(shù)據(jù)的方式梢褐,有不同類型的樹,例如二叉樹赵讯,其中每個(gè)節(jié)點(diǎn)最多有兩個(gè)子節(jié)點(diǎn)盈咳。

與它的近親二叉搜索樹一起,它們也是最流行的樹數(shù)據(jù)結(jié)構(gòu)之一边翼。因此鱼响,你會(huì)發(fā)現(xiàn)很多基于它們的問題,例如如何遍歷它們组底、計(jì)算節(jié)點(diǎn)數(shù)丈积、查找深度,以及檢查它們是否平衡债鸡。

解決二叉樹問題的一個(gè)關(guān)鍵點(diǎn)是對(duì)其理論的深刻理解江滨,例如:什么是二叉樹的大小或深度,什么是葉節(jié)點(diǎn)娘锁,什么是節(jié)點(diǎn)牙寞,以及對(duì)流行的遍歷算法的理解,例如前序莫秆、后序和中序遍歷间雀。

下面是一些經(jīng)常問到的基于二叉樹的面試題,你可以拿來練習(xí):

1镊屎、二叉搜索樹是如何實(shí)現(xiàn)的惹挟?

2、如何在給定二叉樹上實(shí)現(xiàn)前序遍歷缝驳?

3连锯、不使用遞歸如何按照前序遍歷給定二叉樹?

4用狱、如何在給定二叉樹上實(shí)現(xiàn)中序遍歷运怖?

5、不使用遞歸情況下如何使用中序遍歷輸出給定二叉樹所有節(jié)點(diǎn)夏伊?

6摇展、如何實(shí)現(xiàn)后序遍歷算法?

7溺忧、如何不使用遞歸實(shí)現(xiàn)二叉樹的后續(xù)遍歷咏连?

8盯孙、如何輸出二叉搜索樹的所有葉節(jié)點(diǎn)?

9祟滴、如何在給定二叉樹中計(jì)算葉節(jié)點(diǎn)數(shù)目振惰?

10、如何在給定數(shù)組中執(zhí)行二分搜索垄懂?

編程面試問題之雜項(xiàng)

除了基于數(shù)據(jù)結(jié)構(gòu)的問題之外骑晶,大多數(shù)編程工作面試還會(huì)詢問算法、設(shè)計(jì)埠偿、位操作和基于邏輯的常規(guī)問題透罢,我將在本節(jié)中對(duì)其進(jìn)行介紹榜晦。

練習(xí)這些概念很重要冠蒋,因?yàn)橛袝r(shí)在實(shí)際面試中解決這些概念很棘手。提前練習(xí)它們不僅能讓你熟悉它們乾胶,而且還讓你更自信地向面試官解釋其解決方案抖剿。

1、冒泡排序是如何實(shí)現(xiàn)的?

2识窿、迭代式快排算法是如何實(shí)現(xiàn)的斩郎?

3、你如何實(shí)現(xiàn)插入排序算法喻频?

4缩宜、合并排序算法是如何實(shí)現(xiàn)的?

5甥温、桶排序算法是如何實(shí)現(xiàn)的锻煌?

6、計(jì)數(shù)排序算法是如何實(shí)現(xiàn)的姻蚓?

7宋梧、基數(shù)排序算法是如何實(shí)現(xiàn)的?

8狰挡、在不使用第三個(gè)變量的前提下如何交換兩個(gè)數(shù)捂龄?

9、如何檢查兩個(gè)矩形是否重疊加叁?

10倦沧、如何設(shè)計(jì)一個(gè)自動(dòng)售貨機(jī)?

以上這些是數(shù)據(jù)結(jié)構(gòu)和算法之外的一些最常見的面試問題它匕,可以幫助你在面試中做得很好展融。

如果有小伙伴愿意共享自己的解題方法或者思路可以聯(lián)系我哦~屆時(shí)可以整理出有答案的更有意義的一篇~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市超凳,隨后出現(xiàn)的幾起案子愈污,更是在濱河造成了極大的恐慌耀态,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暂雹,死亡現(xiàn)場(chǎng)離奇詭異首装,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)杭跪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門仙逻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涧尿,你說我怎么就攤上這事系奉。” “怎么了姑廉?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵缺亮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我桥言,道長(zhǎng)萌踱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任号阿,我火速辦了婚禮并鸵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扔涧。我一直安慰自己园担,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布枯夜。 她就那樣靜靜地躺著弯汰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卤档。 梳的紋絲不亂的頭發(fā)上蝙泼,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音劝枣,去河邊找鬼汤踏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舔腾,可吹牛的內(nèi)容都是我干的溪胶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稳诚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼哗脖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤才避,失蹤者是張志新(化名)和其女友劉穎橱夭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桑逝,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棘劣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了楞遏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茬暇。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖寡喝,靈堂內(nèi)的尸體忽然破棺而出糙俗,到底是詐尸還是另有隱情,我是刑警寧澤预鬓,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布巧骚,位于F島的核電站,受9級(jí)特大地震影響珊皿,放射性物質(zhì)發(fā)生泄漏网缝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一蟋定、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧草添,春花似錦驶兜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驰后,卻和暖如春肆资,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灶芝。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工郑原, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夜涕。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓犯犁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親女器。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酸役,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容