應對程式設計師面試,你必須知道的八大數據結構

2021-01-13 大數據文摘

大數據文摘出品

編譯:Hope、睡不著的iris、胡笳、雲舟

瑞士計算機科學家Niklaus Wirth在1976年寫了一本書,名為《算法+數據結構=編程》。

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

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

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

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

什麼是數據結構?

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

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

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

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

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

常見的數據結構

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

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

數組

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

每個數據元素都關聯一個正數值,我們稱之為索引,它表明數組中每個元素所在的位置。大部分語言將初始索引定義為零。

以下是數組的兩種類型:

一維數組(如上所示)多維數組(數組的數組)

數組的基本操作

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的二進位數

鍊表

鍊表是另一個重要的線性數據結構,乍一看可能有點像數組,但在內存分配、內部結構以及數據插入和刪除的基本操作方面均有所不同。

鍊表就像一個節點鏈,其中每個節點包含著數據和指向後續節點的指針。 鍊表還包含一個頭指針,它指向鍊表的第一個元素,但當列表為空時,它指向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)」)中的過程。因此,對象以鍵值對的形式存儲,這些鍵值對的集合被稱為「字典」。可以使用鍵搜索每個對象。基於哈希法有很多不同的數據結構,但最常用的數據結構是哈希表。

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

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

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

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

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

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

以上是在編程面試之前你應該知曉的八大數據結構。

相關焦點

  • 《Python程式設計師面試算法寶典》PDF超清版開源了文末附下載方式
    、分類歸納,提煉出算法面試的各種應對技巧,是一本Python程式設計師算法面試的圖書寶典。《Python程式設計師面試寶典》是一本介紹Python程式設計師面試的圖書寶典。這裡,不僅介紹了程式設計師算法面試中的「萬能公式」,而且通過具體的實例從多角度剖析各類算法面試題,為讀者建立了一個完整的算法面試的方案資料庫,讓讀者快速理解全書內容、做到胸有成竹應對面試的同時,也為未來的職業發展鋪平道路。
  • 程式設計師面試通關的 101 道真題
    不論他們如何批評編程面試和程式設計師的聘用過程,他們中的許多人也同樣經歷過這重洗禮。我們都知道編程面試系統並不完美,許多人都在嘗試改變,但在改變之前,你必須遵循規則才能進入系統。我們就把這個問題留給經驗豐富的開發人員來解決吧,作為初級開發人員,你的重點應該是順利通過編程面試,並拿下心儀的工作。
  • 程式設計師的這108個笑話 你都看得懂嗎?-程式設計師,笑話,編程, ——快...
    正好他們摸到工資的時候,一個老程式設計師忽然興奮的大叫:別蠢了,要漲的工資還好好的掛在天上呢!6、諸葛亮是一個優秀的程序猿,每一個錦囊都是應對不同的case而編寫的!但是優秀的程序猿也敵不過更優秀的bug!六出祈山,七進中原,鞠躬盡瘁,死而後已的諸葛亮只因為有一個錯誤的case-馬謖,整個結構就被break了!7、生活中程序猿的真實寫照、一款遊戲一包煙,一臺電腦一下午。
  • 50%是招聘,50%是培訓,100%是程式設計師
    程式設計師水平究竟如何,與崗位要求是否契合,不一定能通過面試環節檢驗出來。 在美國,亞馬遜、Facebook等公司已在採用一種新的程式設計師招聘方式,更注重「技能優先」,考察面試者在算法、數據結構方面的功底,而不是「簡歷優先」。在這種模式下,企業會對應聘者進行在線測評、白板面試等多種形式的技術能力評估,佔比達到了整個環節的70%,這其中主要使用了力扣的題目。
  • 程式設計師和工程師的不同
    打開APP 程式設計師和工程師的不同 發表於 2019-07-19 17:38:13 我剛剛工作的時候,面試官曾經跟我說:好好幹兩年
  • Java數據結構的線性結構和非線性結構,這篇足夠了
    數據結構與算法,可以說是程式設計師的靈魂。大家在找工作面試的時候,尤其是大網際網路公司面試的時候,數據結構與算法必問,想要學好數據結構,首先你要高效而愉快地學習,作為優秀的程式設計師它可以在海量數據計算的時候,依然保持高速地計算。
  • 高效「背誦」面試題的三定法則
    程式設計師求職時,在準備階段都要「背誦」大量的技術面試題,以應對各路精明面試官的百般折磨。 這裡我把「背誦」一詞加上了引號,意指此處的「背誦」可不是一般的背誦。如果你以為我要教你過目不忘記的背誦技巧,那可能會讓你失望了。 請允許我先自賣自誇一波。
  • 想成為嵌入式程式設計師應知道的0x10個基本問題
    C語言測試是招聘嵌入式系統程式設計師過程中必須而且有效的方法。這些年,我既參加也組織了許多這種測試,在這過程中我意識到這些測試能為帶面試者和被面試者提供許多有用信息,此外,撇開面試的壓力不談,這種測試也是相當有趣的。從被面試者的角度來講,你能了解許多關於出題者或監考者的情況。
  • 2020寧夏事業單位面試須知:結構化面試之八大能力
    【導讀】寧夏華圖事業單位考試網同步華圖事業單位發布:2020寧夏事業單位面試須知:結構化面試之八大能力,詳細信息請閱讀下文!:結構化面試之八大能力。(2019年7月14日廣西南寧橫縣事業單位面試試題)   2.應變能力   應變能力是指將考生置於壓力情境下,在思考和解決問題時能夠迅速而靈巧地轉移角度、隨機應變、觸類旁通,做出正確的判斷和處理。應變能力要求考生在應對處理問題時穩定情緒、思維活躍、反應敏捷,兼顧點面。面試題目中,通常要求考生處理正常工作計劃或預期外、突然發生的事情。
  • 程式設計師吐槽:面試平安好醫生,全部通過,卻因IQ測試差一分被拒絕
    程式設計師吐槽:面試平安好醫生,全部通過,卻因IQ測試差一分被拒絕!一般面試的時候,除了面試官以外,有的公司會有一套面試題,面試題也主要是針對崗位的,相信所有程式設計師都應該非常清楚,但是有的公司卻反其道而行之,不做面試題,反而做IQ測試題,平安好醫生就是一個例子,因此,很多程式設計師都在IQ測試題上吃過虧。近日,就有一位程式設計師表示:「去面試平安好醫生,一個上午一面二面hr面全部通過了,誰知道,回來做IQ測試題,因為差一分導致被拒絕,求安慰。」
  • 被嫌棄的35歲程式設計師
    中年焦慮「魔幻」之處在於當你置身其中時,你明知道它是正常現象,卻很難逃離負面情緒的「手掌心」。而這個時候,就越不能做情緒的奴隸,得儘快調整好心態,以防沉浸其中。「其實中年危機時刻伴隨著我,但我覺得只有不斷提升自己,剩下就看運氣了,盡人事聽天命。
  • 面試官問程式設計師:人照鏡子,為啥上下不顛倒,而左右會顛倒
    面試網際網路公司的朋友們都知道,網際網路公司的面試問題都很奇葩。在這裡,你能遇到各種各樣奇怪的問題,而今天一個程式設計師去技術面試,就遭到了面試官的古怪一問。面試官問他:人照鏡子的時候,為啥上下不會顛倒,而左右會顛倒?這個程式設計師表示自己回答了很多,但面試官都舉反例反駁了。所以這個程式設計師就想問問網友們,這答案到底是什麼呢?網友甲說:因為眼睛一左一右,而不是一上一下呀。
  • 五分鐘學編程:怎樣才能學好筆試面試最愛考察的算法
    本文思維導圖什麼是算法上回我們有一篇文章,講述了作為一個新人程式設計師,如何學習數據結構這門課程,其實呢,數據結構和算法是息息相關的,為什麼這麼說呢,因為數據結構本身只是一個載體,而在數據結構之上產生作用和輸出價值的東西其實是算法。
  • 面試必備:數據科學家必須掌握的3個統計學概念
    從某些角度上來講,如今的數據科學家基本上等於現代統計學家。在數據科學面試中,我們也少不了要面對統計學相關的知識。以下是數據科學相關面試中最頻繁出現的三種統計學問題,它們是許多數據科學應用程式的基本構建模塊。
  • 普通程式設計師與高級程式設計師有什麼差別?你知道嗎?
    世界上,程式設計師界的大神很多,諸如Margaret Hamilton(阿波羅計劃飛行控制軟體的幕後英雄)、Donald Knuth(《計算機編程藝術》的作者)、Ken Thompson(Unix 締造者)等等,當你去了解他們的經歷時,你會發現他們能夠達到這種登峰造極的境界,無非是天賦加上努力。
  • 企業的1000種死法:程式設計師鎖死伺服器,網際網路公司如何應對?
    至於燕某,這裡便不作過多評論了,但想必以後以40歲的「高齡」程式設計師+此N番作為,很難再混成啥樣了。類似的事件網上屢見不鮮,有改了網站首頁的,有偷偷遠程刪掉數據的,不一而足。下面說說如何應對:小編作為一家小公司的創始人,同時自己也是技術人員。對於這種情況,還有有些經驗心得的。
  • 專科VS本科:別給專科程式設計師套上學歷的枷鎖!
    對於程式設計師而言,有的學歷乍一看像「皇冠」,把你襯託得熠熠生輝,但更多時候,它像是一個「魔咒」,要麼給你添加了許多不能承受的「重」,要麼讓你畫地為牢,難以掙脫它們的束縛。
  • 你知道高級程式設計師必備的Java開發工具嗎?
    Java程式語言的流行趨勢,帶動了一批Java程式設計師,而每一位Java程式設計師都會有套工具來應對工作上的挑戰。多年來,Java程式設計師使用軟體來完成他們的工作。有很多工具對他們是有用的,而今天小編將列出六款Java程式設計師必備的工具。1.
  • 8個程式設計師常用的刷題網站,第一個你絕對用過!
    ,希望在今後的學習中,對你有所幫助。 程式設計師為什麼要刷題呢? 通過刷題來提高自己所學專業知識的鞏固程度,知道自己的不足之處 有可能你通過這些平臺刷過的題,會在今後的面試過程中遇到 通過刷題來增加面試的信心,從而來增加拿到滿意 offer 以下刷題網站,可給你提供大量的編程題目練習,提高你的編程能力。
  • 20道你必須要背會的微服務面試題,面試一定會被問到
    寫在前面:在學習springcloud之前大家一定要先了解下,常見的面試題有那塊,然後我們帶著問題去學習這個微服務技術,那麼就會更加理解springcloud技術。如果你已經學了springcloud,那麼在準備面試的時候,一定要看看看這些面試題。