Java 程式設計師必須掌握的 8 道數據結構面試題你會幾道?

2020-12-16 酷扯兒

本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫

40多年後,這個等式仍被奉為真理。這就是為什麼在面試過程中,需要考察軟體工程師對數據結構的理解。

幾乎所有的問題都需要面試者對數據結構有深刻的理解。無論你是初入職場的新兵(剛從大學或者編程培訓班畢業),還是擁有幾十年經驗的職場老鳥。

有些面試題會明確提及某種數據結構,例如,「給定一個二叉樹。」而另一些則隱含在面試題中,例如,「我們希望記錄每個作者相關的書籍數量。」

即便是對於一些非常基礎的工作來說,學習數據結構也是必須的。那麼,就讓我們先從一些基本概念開始入手。

什麼是數據結構?

簡單地說,數據結構是以某種特定的布局方式存儲數據的容器。這種「布局方式」決定了數據結構對於某些操作是高效的,而對於其他操作則是低效的。首先我們需要理解各種數據結構,才能在處理實際問題時選取最合適的數據結構。

為什麼我們需要數據結構?

數據是計算機科學當中最關鍵的實體,而數據結構則可以將數據以某種組織形式存儲,因此,數據結構的價值不言而喻。

無論你以何種方式解決何種問題,你都需要處理數據——無論是涉及員工薪水、股票價格、購物清單,還是只是簡單的電話簿問題。

數據需要根據不同的場景,按照特定的格式進行存儲。有很多數據結構能夠滿足以不同格式存儲數據的需求。

常見的數據結構

首先列出一些最常見的數據結構,我們將逐一說明:

數組隊列鍊表字典樹(這是一種高效的樹形結構,但值得單獨說明)散列表(哈希表)

數組是最簡單、也是使用最廣泛的數據結構。棧、隊列等其他數據結構均由數組演變而來。下圖是一個包含元素(1,2,3和4)的簡單數組,數組長度為4。

每個數據元素都關聯一個正數值,我們稱之為索引,它表明數組中每個元素所在的位置。大部分語言將初始索引定義為零。關注Java技術棧微信公眾號,回復"面試"獲取更多博主精心整理的面試題。

以下是數組的兩種類型:

一維數組(如上所示)多維數組(數組的數組)數組的基本操作

Insert——在指定索引位置插入一個元素Get——返回指定索引位置的元素Delete——刪除指定索引位置的元素Size——得到數組所有元素的數量面試中關於數組的常見問題

尋找數組中第二小的元素找到數組中第一個不重複出現的整數合併兩個有序數組重新排列數組中的正值和負值

著名的撤銷操作幾乎遍布任意一個應用。但你有沒有思考過它是如何工作的呢?這個問題的解決思路是按照將最後的狀態排列在先的順序,在內存中存儲歷史工作狀態(當然,它會受限於一定的數量)。這沒辦法用數組實現。但有了棧,這就變得非常方便了。

可以把棧想像成一列垂直堆放的書。為了拿到中間的書,你需要移除放置在這上面的所有書。這就是LIFO(後進先出)的工作原理。

下圖是包含三個數據元素(1,2和3)的棧,其中頂部的3將被最先移除:

棧的基本操作

Push——在頂部插入一個元素Pop——返回並移除棧頂元素isEmpty——如果棧為空,則返回trueTop——返回頂部元素,但並不移除它面試中關於棧的常見問題

使用棧計算後綴表達式對棧的元素進行排序判斷表達式是否括號平衡

與棧相似,隊列是另一種順序存儲元素的線性數據結構。棧與隊列的最大差別在於棧是LIFO(後進先出),而隊列是FIFO,即先進先出。

一個完美的隊列現實例子:售票亭排隊隊伍。如果有新人加入,他需要到隊尾去排隊,而非隊首——排在前面的人會先拿到票,然後離開隊伍。

下圖是包含四個元素(1,2,3和4)的隊列,其中在頂部的1將被最先移除:

移除先入隊的元素、插入新元素

隊列的基本操作

Enqueue()——在隊列尾部插入元素Dequeue()——移除隊列頭部的元素isEmpty()——如果隊列為空,則返回trueTop()——返回隊列的第一個元素面試中關於隊列的常見問題

使用隊列表示棧對隊列的前k個元素倒序使用隊列生成從1到n的二進位數

鍊表是另一個重要的線性數據結構,乍一看可能有點像數組,但在內存分配、內部結構以及數據插入和刪除的基本操作方面均有所不同。關注Java技術棧微信公眾號,回復"面試"獲取更多博主精心整理的面試題。

鍊表就像一個節點鏈,其中每個節點包含著數據和指向後續節點的指針。 鍊表還包含一個頭指針,它指向鍊表的第一個元素,但當列表為空時,它指向null或無具體內容。

鍊表一般用於實現文件系統、哈希表和鄰接表。

這是鍊表內部結構的展示:

鍊表包括以下類型:

單鍊表(單向)雙向鍊表(雙向)鍊表的基本操作:

InsertAtEnd - 在鍊表的末尾插入指定元素InsertAtHead - 在連結列表的開頭/頭部插入指定元素Delete - 從連結列表中刪除指定元素DeleteAtHead - 刪除連結列表的第一個元素Search - 從鍊表中返回指定元素isEmpty - 如果鍊表為空,則返回true面試中關於鍊表的常見問題

反轉鍊表檢測鍊表中的循環返回鍊表倒數第N個節點刪除鍊表中的重複項

圖是一組以網絡形式相互連接的節點。節點也稱為頂點。 一對節點(x,y)稱為邊(edge),表示頂點x連接到頂點y。邊可以包含權重/成本,顯示從頂點x到y所需的成本。

圖的類型

無向圖有向圖

在程序語言中,圖可以用兩種形式表示:

鄰接矩陣鄰接表

常見圖遍歷算法

廣度優先搜索深度優先搜索

面試中關於圖的常見問題

實現廣度和深度優先搜索檢查圖是否為樹計算圖的邊數找到兩個頂點之間的最短路徑

樹形結構是一種層級式的數據結構,由頂點(節點)和連接它們的邊組成。 樹類似於圖,但區分樹和圖的重要特徵是樹中不存在環路。

樹形結構被廣泛應用於人工智慧和複雜算法,它可以提供解決問題的有效存儲機制。

這是一個簡單樹的示意圖,以及樹數據結構中使用的基本術語:

Root - 根節點

Parent - 父節點

Child - 子節點

Leaf - 葉子節點

Sibling - 兄弟節點

以下是樹形結構的主要類型:

N元樹平衡樹二叉樹二叉搜索樹AVL樹紅黑樹2-3樹

其中,二叉樹和二叉搜索樹是最常用的樹。

面試中關於樹結構的常見問題:

求二叉樹的高度在二叉搜索樹中查找第k個最大值查找與根節點距離k的節點在二叉樹中查找給定節點的祖先節點

字典樹(Trie)

字典樹,也稱為「前綴樹」,是一種特殊的樹狀數據結構,對於解決字符串相關問題非常有效。它能夠提供快速檢索,主要用於搜索字典中的單詞,在搜尋引擎中自動提供建議,甚至被用於IP的路由。

以下是在字典樹中存儲三個單詞「top」,「so」和「their」的例子:

這些單詞以頂部到底部的方式存儲,其中綠色節點「p」,「s」和「r」分別表示「top」,「thus」和「theirs」的底部。

面試中關於字典樹的常見問題

計算字典樹中的總單詞數列印存儲在字典樹中的所有單詞使用字典樹對數組的元素進行排序使用字典樹從字典中形成單詞構建T9字典(字典樹+ DFS )

哈希表

哈希法(Hashing)是一個用於唯一標識對象並將每個對象存儲在一些預先計算的唯一索引(稱為「鍵(key)」)中的過程。因此,對象以鍵值對的形式存儲,這些鍵值對的集合被稱為「字典」。可以使用鍵搜索每個對象。基於哈希法有很多不同的數據結構,但最常用的數據結構是哈希表。

哈希表通常使用數組實現。

散列數據結構的性能取決於以下三個因素:

哈希函數哈希表的大小碰撞處理方法

下圖為如何在數組中映射哈希鍵值對的說明。該數組的索引是通過哈希函數計算的。

面試中關於哈希結構的常見問題:

在數組中查找對稱鍵值對追蹤遍歷的完整路徑查找數組是否是另一個數組的子集檢查給定的數組是否不相交

相關焦點

  • 2021 必須掌握的 21個Java 核心技術
    JVM作為java運行的基礎,很難相信對於JVM一點都不了解的人可以把java語言吃得很透。 我在面試有超過3年Java經驗的開發者的時候, JVM幾乎就是一個必問的問題了。 當然JVM不是唯一決定技術能力好壞的面試問題,但是可以佐證java開發能力的高低。
  • 黑馬程式設計師Java學習的六大要點
    本網8月19日訊 很多人學習Java都學的迷迷糊糊的,很長時間學完還是做不出一個像樣的程序,是因為很多人學習Java都想走捷徑,想一步到位。俗話說,不走彎路就是捷徑。那黑馬程式設計師如何學Java才能學紮實,最起碼這六大要點你要掌握。
  • 四面阿里斬獲offer定級P7,2020最新最全阿里巴巴68道高級面試題
    面試:如果不準備充分的面試,完全是浪費時間,更是對自己的不負責。今天給大家分享下我整理的Java架構面試專題及答案(文末見面試答案),其中大部分都是大企業面試常問的面試題,可以對照這查漏補缺,當然了,這裡所列的肯定不可能覆蓋全部方式,不過也希望能對即將找工作的朋友起到一些幫助!
  • 2021國考面試考什麼?幾道題?答題時間多長?
    國考面試將於明年2月進行面試不等同於筆試,想要在數萬大軍中不被刷下去面試環節必須要重視最近有很多同學在後臺問小編國考面試有幾道題?獨立命題的系統中,除外交部上、下午各1套題之外,其餘的均是一天1套題;統考系統上、下午各提供1套題,但到底是全天使用1套題,還是上、下午各使用1套題,由各招考單位自行選擇。一般情況下,每套題包括4-5道題,答題時間20-25分鐘。
  • 看完這份3625頁Java面試題,字節,阿里等大廠offer拿到手軟
    最近又趕上跳槽的高峰期,好多粉絲,都問我要有沒有最新面試題,索性,我就把我看過的和我面試中的真題,及答案都整理好,整理了《第2版:網際網路大廠面試題》並分類 92份PDF,累計 3625頁!我會持續更新中,馬上就出第三版,涵蓋大廠算法會更多!
  • Java基礎面試題簡單總結
    ,什麼時候被執行,在return前還是後答:會執行,在return前執行23、用最有效率的方法算出2乘以8等於幾答:2 << 3java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未被捕獲的運行時異常。
  • 萬字梳理,帶你拿下 Java 面試題!
    HashMap 會把 Null key 當做普通的 key 對待。不允許 null key 重複。線程安全性:HashMap 不是線程安全的,如果多個外部操作同時修改 HashMap 的數據結構比如 add 或者是 delete,必須進行同步操作,僅僅對 key 或者 value 的修改不是改變數據結構的操作。
  • java面試題之《Array 和ArrayList的區別》
    大家在刷java面試題時肯定有遇到過《Array 和ArrayList的區別》這個面試題。今天就來聊聊他們二者的區別。ArrayList底層是用數組實現的,但是ArrayList的長度是可變的,在每次添加時,如果發現空間不足的話,會創建一個長度大概是原來1.5倍的新數組(java8源碼),然後把原來的數組元素複製過去。Array就好像是已經定製好的柜子,就是那麼多格子。
  • Java學到什麼程度才能叫精通?
    我個人覺得「精通」這個詞有點過,一般人是不會說自己精通某個東西,通常用熟練並掌握來說明你對某個技術有研究。下面是我總結的一些初中級Java程式設計師必備的知識:總結:初中級 Java 程式設計師必須掌握的知識。熟練掌握數據結構、算法、作業系統、計算機網絡等基礎知識。
  • 新手程式設計師進階之路:10個學習網站,告訴你刷題怎麼選擇?
    對於新手、進階的程式設計師來說,刷題能夠讓你的編程能力會得到一個質的飛躍。但也不能盲目刷題,發現自身最薄弱的環節,才能學以致用,以下推薦滿足你任何面試和學習需求。
  • 面試Java程式設計師想拿 10K,面試官說你只值8K,如何應付?
    在IT行業混了很多年,也面試過很多Java程式設計師,非常了解面試者和面試官的心理,我可以很負責的告訴你:就算面試你的人說你只能拿8K,但是你完全可以通過各種方法去拿到10K以上的薪資!面試的時候面試官都是什麼樣的心理?
  • 高效「背誦」面試題的三定法則
    你還可以使用遞進式結構來提取面試題中的知識要點。 舉例:Vue生命周期總共有 11 個,常用的有 8 個,分為初始化、掛載、更新和銷毀這 4個階段。 事實上,用人單位和面試官需要的是一個有邏輯的程式設計師,而不只是一個「能背誦」的「記憶力大師」。 以 題目2 為例: 題目2是一道開放式題目,你採用 並列式結構 來準備面試題,那麼你只用分條說明白 MVVM、MVC 和 MVP 即可。
  • 迷茫期後面試阿里奮發圖強8個月,如願拿到offer,定級阿里P7
    「80%的oer掌握在20%的人手中」這句話也不是不無道理的。決定你面試能否成功的因素中實力固然佔有很大一部 分比例,但是如果你的心態或者說運氣不好的話,依然無法拿到滿意的 oer。在杭州工作兩年,14年來到深圳,從事java開發一晃8年。嘗試過2次開發方向的轉變,一次是2014年左右,移動APP的浪潮時期,自學了安卓開發半年,結果還沒等轉開發方向成功,移動開發的浪潮就逐漸過去,第一次轉變嘗試就這樣胎死腹中,白忙活一場。第二次是2015~16年,這個時間點正是大數據開發最熱門的時期,自學各種大數據框架,無奈受限於學歷,並沒有找到滿意的工作,只能回歸java。
  • 15道Google面試題,你會做嗎?
    導讀:進入像谷歌這樣的網際網路公司是許多人的夢想,而這些公司的面試卻是很大的檻。那麼,谷歌對前來應聘的工程師會提出什麼樣的問題呢?我們這裡收集了來自職業發展社區Glassdoor的一些面試者真實經歷的面試題。
  • Java後端面試經驗:了解8大核心競爭點,讓你輕鬆通過面試!
    要知道,我們平時幹活更偏重於業務,不可能大量接觸到算法,數據結構,底層代碼這類面試必問的問題點,換句話說,面試準備點和平時工作要點匹配度很小。 四、Java核心方面,圍繞數據結構和性能優化準備面試題 Java核心這塊,網上的面試題很多,不過在此之外
  • 如何學習Java,哪裡開始學Java比較好?
    推薦初學者看《Java入門到精通》《Head first Java》《java核心技術卷》《Java編程思想》  程式設計師必備:程式設計師必備 Java 核心知識點整理  Java學習書籍整理、Web前後端、各種框架、資料庫及IT行業等類型電子書  掌握面一門語言,首先得掌握它的思想,思想決定高度。
  • Java面試題中Spring常問問題
    Spring 早已成為 Java 後端開發事實上的行業標準,無數的公司選擇 Spring 作為基礎的開發框架,大部分 Java 後端程式設計師在日常工作中也會接觸到 Spring,那麼,你對spring的主要技術點掌握了多少呢?
  • 小公司與大公司的Java程式設計師有什麼差別?如何才能進入大公司?
    但如果程式設計師畢業後一直在大公司裡幹,5年後,如果上進些,技術層面應該掌握不少值錢的技術,比如大數據,分布式組件或雲端部署,從經驗角度,可以調試和排查組件底層的問題,從運維角度,至少能在linux部署組件,這種人如果繼續在大公司裡深造,晉級到資深架構指日可待,如果這個時候去小公司,做個技術主管問題應該也不大。
  • 工作五年,一年內我靠這系列java面試寶典從13K到大廠30K
    我認為對於面試以及進階最佳的學習方法莫過於刷題+博客+書籍+總結!前三者我將淋漓盡致地揮毫於這篇文章中,至於總結要靠個人。實際上越到後面你越會發現面試並不難,其次就是在刷題的過程中有沒有去思考,刷題只是次之,這又是一個層次了,這裡暫時不提後面再談。
  • 50%是招聘,50%是培訓,100%是程式設計師
    在程式設計師這一側,力扣提供了大量原創題目,供程式設計師學習以增強實操能力。這些題目經常會被國內外網際網路名企用作面試真題,所以程式設計師可以刷題了解大公司的編程技能側重點,同時力扣還有程式設計師的交流社區,可以就一些理論與實操問題進行分享。 據報導,有位華人程式設計師去矽谷面試,因為算法與數據結構方面的問題,求職不順利。