
何海濤著
本書剖析了50個典型的程序員面試題。全書分爲7章,主要包括面試的流程,討論面試流程中每一環節需要注意的問題;面試需要的基礎知識,從編程語言、數據結構及算法三方面總結了程序員面試的知識點;高質量的代碼,討論影響代碼質量的的3個要素;解決面試題的思路,總結在編程面試中解決難題的常用思路;面試中的各種能力,本章總結應聘者在面試過程中如何表現學習能力和溝通能力;兩個面試案例,這兩個案例總結了應聘者在面試過程中哪些舉動是不好的行爲,而哪些表現又是面試官所期待的行爲。
一本好書。對數據結構和算法的理解又深入了一步。喜歡鏈表/樹/位運算/輔助棧/隊列/排序這種類型的題目,但每次出現遞歸題,需要在紙上畫半天才能理解[流淚]感慨自己的智商捉急。尤其是遞歸函數嵌套在代碼中間的代碼,更是難上加難。。。 anyway,有趣的程序有趣的代碼!繼續努力吧! 全書都是基於c++語言實現的,相當於又溫習了一遍c++。
雖然知識點和我的專業關係不大,但是邏輯思維和處理方法還是相通的,讓我想起來之前每次去面試的時候,遇到技術面就抓瞎,回答不上來問題就很尷尬,但是有一點是深圳的技術面試官很裝逼,有些覺得自己懂一點技術就厲害的不行,但是真正的技術大佬都很和藹可親,這就是反差,面試找工作這件事也是得看緣分的。紙質書已經買了。
回憶 10 多年 這本神書. 好多那會計算機年輕人靠這本書改變了窮苦命. 那會會這本書基本上能進入很不錯的平臺, 完成第一桶金積累
面試必看的一本書,非常經典,看完收穫不少,還是要多動手,提到的面試題不多,看了下附上的完整代碼,每一個都有各種不同輸入測試,爭取自己先刷一遍,然後對照一下找差距。
很多時候我們不是個人能力有多大的缺陷,而是因爲自己沒有做過面試官,不清楚面試要考察的到底是什麼,造成面試的時候唯唯諾諾,猜測面試官想聽到什麼答案。這本書從面試官的角度,剖析了面試時考察的是應聘者的哪些方面,我們瞭解了這些之後,針對相關考察內容展示自己的能力就可以做到更加從容。最後,作爲一個工作了幾年的開發者,感謝作者幫我打開了應對面試的思路~
有思路講解,覆蓋了面試中常見的問題和場景。只是選題已經比較老了還可以再經典一些,比自己悶頭刷題效率和質量上都好很多。 通常面試官除了期待應聘者寫出的代碼能夠完成基本的功能之外,還能應對特殊情況並對非法輸入進行合理的處理。 >通常面試官除了期待應聘者寫出的代碼能夠完成基本的功能之外,還能應對特殊情況並對非法輸入進行合理的處理。 除此之外,有些面試官還喜歡考查應聘者的知識遷移能力、抽象建模能力和發散思維能力。 >除此之外,有些面試官還喜歡考查應聘者的知識遷移能力、抽象建模能力和發散思維能力。 如果面試的時候遇到的題目很難,我們可以試圖把一個大的複雜的問題分解成若干個小的簡單的子問題,然後遞歸地去解決這些子問題。 >如果面試的時候遇到的題目很難,我們可以試圖把一個大的複雜的問題分解成若干個小的簡單的子問題,然後遞歸地去解決這些子問題。 如何從基本功能測試、邊界值測試、性能測試等方面去設計測試用例,從而提高編寫高質量代碼的能力 >如何從基本功能測試、邊界值測試、性能測試等方面去設計測試用例,從而提高編寫高質量代碼的能力 ◆ 1.2 面試的三種形式 如果應聘者是先寫單元測試用例,再寫解決問題的函數,我相信面試官定會對你刮目相看,因爲能做到測試在前、開發在後的程序員實在是太稀缺了,他會毫不猶豫地拋出綠色的橄欖枝。 >如果應聘者是先寫單元測試用例,再寫解決問題的函數,我相信面試官定會對你刮目相看,因爲能做到測試在前、開發在後的程序員實在是太稀缺了,他會毫不猶豫地拋出綠色的橄欖枝。 ◆ 1.3 面試的三個環節 面試官除了希望應聘者的代碼能夠完成基本的功能之外,還會關注應聘者是否考慮了邊界條件、特殊輸入(比如 NULL 指針,空字符串等)及錯誤處理。 >面試官除了希望應聘者的代碼能夠完成基本的功能之外,還會關注應聘者是否考慮了邊界條件、特殊輸入(比如 NULL 指針,空字符串等)及錯誤處理。 面試小提示: 如果在面試的時候遇到難題,我們有 3 種辦法分析、解決複雜的問題:畫圖能使抽象問題形象化,舉例使抽象問題具體化,分解使複雜問題簡單化。 >面試小提示: 如果在面試的時候遇到難題,我們有 3 種辦法分析、解決複雜的問題:畫圖能使抽象問題形象化,舉例使抽象問題具體化,分解使複雜問題簡單化。 ◆ 1.4 本章小結 基礎知識是否紮實、能否寫出高質量的代碼、思路是否清晰、是否有優化效率的能力,以及包括學習能力、溝通能力在內的綜合素質是否優秀。 >基礎知識是否紮實、能否寫出高質量的代碼、思路是否清晰、是否有優化效率的能力,以及包括學習能力、溝通能力在內的綜合素質是否優秀。 ◆ 2.3 數據結構 在C/C++中,當數組作爲函數的參數進行傳遞時,數組就自動退化爲同類型的指針 >在C/C++中,當數組作爲函數的參數進行傳遞時,數組就自動退化爲同類型的指針 當幾個指針賦值給相同的常量字符串時,它們實際上會指向相同的內存地址。但用常量內存初始化數組,情況卻有所不同。數組會先分配一塊內存,然後將字符內容拷貝到內存中。所以是不同的內存地址。 >爲了節省內存,C/C++把常量字符串放到單獨的一個內存區域。當幾個指針賦值給相同的常量字符串時,它們實際上會指向相同的內存地址。但用常量內存初始化數組,情況卻有所不同。 ref和out這兩個關鍵字都能夠提供相似的功效,其作用也很像C中的指針變量。它們的區別是: 1、使用ref型參數時,傳入的參數必須先被初始化。對out而言,必須在方法中對其完成初始化。 2、使用ref和out時,在方法的參數和執行方法時,都要加Ref或Out關鍵字。以滿足匹配。 3、out適合用在需要retrun多個返回值的地方,而ref則用在需要被調用的方法修改調用者的引用的時候。 out 方法參數上的 out 方法參數關鍵字使方法引用傳遞到方法的同一個變量。當控制傳遞迴調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。 當希望方法返回多個值時,聲明 out 方法非常有用。使用 out 參數的方法仍然可以返回一個值。一個方法可以有一個以上的 out 參數。 若要使用 out 參數,必須將參數作爲 out 參數顯式傳遞到方法。out 參數的值不會傳遞到 out 參數。 不必初始化作爲 out 參數傳遞的變量。 >ref或者out 合併兩個數組(包括字符串)時,如果從前往後複製每個數字(或字符)需要重複移動數字(或字符)多次,那麼我們可以考慮從後往前複製,這樣就能減少移動的次數,從而提高效率。 >合併兩個數組(包括字符串)時,如果從前往後複製每個數字(或字符)需要重複移動數字(或字符)多次,那麼我們可以考慮從後往前複製,這樣就能減少移動的次數,從而提高效率。 ◆ 2.4 算法和數據操作 >> 哈希表最主要的優點是我們利用它能夠在 O(1)時間查找某一元素,是效率最高的查找方式。但其缺點是需要額外的空間來實現哈希表。 >> 快速排序雖然總體的平均效率是最好的,但也不是任何時候都是最優的算法。比如數組本身已經排好序了,而每一輪排序的時候都是以最後一個數字作爲比較的標準,此時快速排序的效率只有O(n2) >> 因爲除法的效率比移位運算要低得多,在實際編程中應儘可能地用移位運算符代替乘除法。 二進制問題的殺手鐧–>如何消去最右邊的1–>數的二進制中有多少個1 >把一個整數減去 1 之後再和原來的整數做位與運算,得到的結果相當於是把整數的二進制表示中的最右邊一個1變成0。很多二進制的問題都可以用這個思路解決。 ◆ 2.5 本章小結 >> 查找(特別是二分查找)和排序(特別是快速排序和歸併排序)是面試中最經常考查的算法,應聘者一定要熟練掌握。 ◆ 3.3 代碼的完整性 >> 通常面試官會檢查應聘者的代碼是否完成了基本功能、輸入邊界值是否能得到正確的輸出、是否對各種不合規範的非法輸入做出了合理的錯誤處理。 >> 通常我們可以從功能測試、邊界測試和負面測試三方面設計測試用例,以確保代碼的完整性 >> 如果面試題是關於 n位的整數並且沒有限定 n的取值範圍,或者是輸入任意大小的整數,那麼這個題目很有可能是需要考慮大數問題的。字符串是一個簡單、有效的表示大數的方法。 ◆ 3.4 代碼的魯棒性 >> 也就是說解耦的好處就是提高了代碼的重用性 避免數組插入造成O(n)複雜度,可以在數組頭尾定義兩個指針來解決,快排的一輪排序算法也是在這個基礎上增加兩個交換操作實現的。 >要在短時間內按照要求把數組分隔成兩部分,不是一件容易的事情,需要較快的思維能力。 >> 魯棒性是指程序能夠判斷輸入是否合乎規範要求,並對不合要求的輸入予以合理的處理。 >> 容錯性是魯棒性的一個重要體現。 >> 提高代碼的魯棒性的有效途徑是進行防禦性編程。防禦性編程是一種編程習慣,是指預見在什麼地方可能會出現問題,併爲這些可能出現的問題制定處理方式。 >> 在面試時,最簡單也最實用的防禦性編程就是在函數入口添加代碼以驗證用戶輸入是否符合要求。 ◆ 第4章 解決面試題的思路 >> 應聘者可以採用舉例子、畫圖等多種方式,解釋清楚問題本身和問題解決方案是關鍵。 ◆ 4.2 畫圖讓抽象問題形象化 >> 很多面試題很抽象,不是很容易找到解決辦法。這時不妨畫出一些與題目相關的圖形,藉以輔助自己觀察和思考。圖形能使抽象的問題具體化、形象化 >> 很多時候空想未必能想明白題目中隱含的規律和特點,隨手畫幾張圖卻能讓我們輕易找到竅門。 ◆ 4.3舉例讓抽象問題具體化 >> 如果面試題是要求處理一棵二叉樹的遍歷序列,我們可以先找到二叉樹的根結點,再基於根結點把整棵樹的遍歷序列拆分成左子樹對應的子序列和右子樹對應的子序列,接下來再遞歸地處理這兩個子序列。 ◆ 4.4 分解讓複雜問題簡單化 >> 通常分治法思路都可以用遞歸的代碼實現 ◆ 5.2 時間效率 >> 比如 C/C++程序員要養成採用引用(或指針)傳遞複雜類型參數的習慣。如果採用值傳遞的方式,從形參到實參會產生一次複製操作。這樣的複製是多餘的操作,我們應該儘量避免 >> 當需要在某數據容器內頻繁查找及替換最大值時,我們要想到二叉樹是個合適的選擇,並能想到用堆或者紅黑樹等特殊的二叉樹來實現。 >> 雖然通常我們用遞歸的方式分析動態規劃的問題,但最終都會基於循環去編碼。 >> 一個有效的比較規則需要3個條件:自反性、對稱性和傳遞性 ◆ 6.2 溝通能力和學習能力 >> 面試是一個雙向交流的過程,面試官可以問應聘者問題,同樣應聘者也可以向面試官提問。如果應聘者能夠針對面試題主動地提出幾個高質量的問題,面試官就會覺得他有很強的溝通能力和學習能力。 江湖險惡,HR難測。 >有些面試官故意一開始不把題目描述清楚,讓題目存在一定的二義性。他期待應聘者能夠一步步通過提問來弄明白題目的要求。 >> 有些面試官故意一開始不把題目描述清楚,讓題目存在一定的二義性。他期待應聘者能夠一步步通過提問來弄明白題目的要求。 ◆ 6.3 知識遷移能力 >> 每個結點只遍歷一次的解法,正是面試官喜歡的 >> 通常我們可以用循環求一個連續序列的和,但考慮到每一次操作之後的序列和操作之前的序列相比大部分數字都是一樣的,只是增加或者減少了一個數字,因此我們可以在前一個序列的和的基礎上求操作之後的序列的和。這樣可以減少很多不必要的運算,從而提高代碼的效率。 ◆ 6.4 抽象建模能力 >> 建模的第一步是選擇合理的數據結構來表述問題。 >> 建模的第二步是分析模型中的內在規律,並用編程語言表述這種規律。
10年出版的,當時C++11標準都沒有,放到現在很多題目的代碼語法已經過時了。 另外這本書講解題目的語言邏輯存在硬傷,很多情況下對解題思路沒有遵循從頭到尾的順序,中間莫名其妙跳過了重點銜接部分直接給出結論。 最後是書中相當多的題目,在今天已經是基礎中的基礎,好多更復雜的數據結構和算法得額外學習,僅僅滿足於鏈表-棧-隊列-二叉樹是完全不夠的,更爲複雜的圖結構、拓撲排序、動態規劃還得完善。 不得不感慨,計算機行業發展迅速,知識更新週期短,到2025年之後,大模型可以直接生成高質量的標準化代碼,使得本書涉及的技術放在2010年能夠搞定工程任務,放到現在只夠打個基礎。想達到平均水準自然也是水漲船高,任重而道遠啊
全書分爲7章,各章的主要內容如下: 第 1 章介紹面試的流程。通常整個面試過程可以分爲電話面試、共享桌面遠程面試和現場面試 3 個階段,每一輪面試又可以分爲行爲面試、技術面試和應聘者提問 3 個環節。本章詳細討論了面試中每一環節需要注意的問題。其中第1.3.2節深入討論了技術面試中的5個要素,是全書的大綱,接下來的第2~6章逐一討論每個要點。 第 2 章梳理應聘者接受技術面試時需要用到的基礎知識。本章從編程語言、數據結構及算法三方面總結了程序員面試的知識點。 第3 章討論應聘者在面試時寫出高質量代碼的3 個要點。通常面試官除了期待應聘者寫出的代碼能夠完成基本的功能之外,還能應對特殊情況並對非法輸入進行合理的處理。讀完這一章,讀者將學會如何從規範性、完整性和魯棒性3個方面提高代碼的質量。 第 4 章總結在編程面試中解決難題的常用思路。如果在面試過程中遇到複雜的難題,應聘者最好在寫代碼之前形成清晰的思路。讀者在讀完這一章之後將學會如何用畫圖、舉例和分解複雜問題3種思路來解決問題。 第 5 章介紹如何優化代碼的時間效率和空間效率。如果一個問題有多種解法,面試官總是期待應聘者能找到最優的解法。讀完這一章,讀者將學會優化時間效率及空間換時間的常用算法。 第 6 章總結面試中的各項能力。面試官在面試過程中會一直關注應聘者的學習能力和溝通能力。除此之外,有些面試官還喜歡考查應聘者的知識遷移能力、抽象建模能力和發散思維能力。讀完這一章,讀者將學會如何培養和運用這些能力。 第 7 章是兩個面試的案例。在這兩個案例中,我們將看到應聘者在面試過程中的哪些舉動是不好的行爲,而哪些表現又是面試官所期待的行爲。衷心地希望應聘者能在面試時少犯甚至不犯錯誤,完美地表現出自己的綜合素質,最終拿到心儀的Offer。
很經典的一本編程算法面試備考書籍,裏面有很多經典的例題,都是曾經的高頻考點。大多數題目並不是很難,但是看到書中巧妙解答,總有一種醍醐灌頂的感覺。作者講到的優化解法很有啓發,受益匪淺。
2024.No53: 24年第24本技術書。關於程序員面試,首先,也是必不可少的一些經驗之談,如面試形式、流程。 然後直入主題,畢竟這是一本技術書。內容包括:基礎數據結構(數組、字符串、鏈表、樹、隊列、棧)、基礎算法(查找、排序、遞歸、循環、位運算)、時間和空間複雜度、能力(知識遷移、抽象建模、發散思維)。基本上不用看書就能對書本的目錄章節設置猜出個7~8成。 想拿到好的Offer,一定要擅長算法。大環境不好,程序員(尤其是Java、Python、JS前端)門檻低+行業卷+經濟下行等因素,面試官被迫在1~2個小時內考查出一個人的綜合素質。 怎麼考察?算法唄。