在前面課時中,我們介紹了技術面試的流程。本課時我們將重點剖析面試流程中的手寫代碼環節,幫助你換一種思路迎接面試。
#### 手寫代碼的能力考核
首先,我們要明確一點,手寫代碼要比在 IDE 里寫代碼難得多。在很多 IDE 中,敲一個 Str 出來,就會自動補全 ing,得到 String。反括號"}",也會自動與前面的括號呼應。即使代碼敲錯了,按下 backspace 就可以回到原來的位置重新寫。
而手寫代碼就沒有這么便捷的“功能”了。如果你前面的代碼寫錯了,或者忘記定義變量了,那么勾勾畫畫就會讓紙上的卷面亂七八糟,這勢必會影響代碼的呈現。 因此,手寫代碼必須謀定而后動 。
但是,我也曾多次聽到這樣的聲音,很多人會說:“我入職之后是在 IDE 里寫代碼,為什么面試要給我增加難度,偏偏要在紙上寫呢?”
其實,原因就在于 IDE 幫助工程師減負,但工程師的能力不應該下降。在紙上寫代碼,特別鍛煉一個候選人的全局視野。 它考察的是候選人關于模塊、函數的分解能力,對代碼中變量的聲明、初始化、賦值運算的設計框架以及對于編碼任務的全方面把控能力 。
如果一個候選人,通過勾勾抹抹完成了一個編碼任務,其實是能反映出他不具備全局思考的能力,只能是走一步看一步地去解決問題。
#### 手寫代碼的全局觀解題方法
那么,如何謀定而后動呢?一個簡單的標準就是,避免寫一行、想一行,而要建立手寫代碼的全局觀。具體而言,就跟我們這個專欄一直強調的方法論不謀而合了。
* 首先,根據問題進行 復雜度的分析。估算問題中復雜度的上限和下限。
* 接著,定位問題。根據問題類型,確定采用何種算法思維。
* 然后,分析數據操作。根據增、刪、查和數據順序關系去選擇合適的數據結構,利用空間換取時間。
* 分析完這些之后,想一下這段代碼大致包含哪些模塊,需要拆解出哪些函數,需要用到哪些變量,以及每個變量在哪里聲明和賦值。
* 有了這些全局觀后,再動手去寫代碼。
這種實操層面的能力,就需要你千錘百煉了。因此,前面課程中的問題或代碼,請盡可能在紙上嘗試著再寫一遍。如果你能保持干凈整潔地寫出代碼,你一定會有不一樣的收獲和體會。
#### 如果不會寫代碼怎么辦
最后一個問題,也是最實際的問題,那就是如果在手寫代碼環節,遇到了自己真的不會實現的問題,該怎么辦呢?
下面我們分情況來討論。
**第一種可能性:你有思路、有方法,但代碼中要用到一塊你不會編碼的內容**
例如,這個問題需要用到哈希表,但你以前寫代碼的過程中沒有用過。變量聲明和一些接口函數名不太清楚。
那么,你可以考慮在寫代碼的對應部分用偽代碼來代替,并如實告知面試官。這并不丟人。因為每個人的知識體系都有盲區,工程師遇到自己陌生的知識,都需要翻閱相關的幫助文檔。但這些都不會成為你實現某個功能或代碼的阻塞點。
**第二種可能性:你有思路,但不確定對錯**
這種情況,你應該在問題分析的階段,與面試官進行問題的討論。切記不可以自己悶著頭想 10 分鐘還沒有結果的時候,再跟面試官說我不會。永遠牢記一點,面試時間非常寶貴,不要浪費彼此時間。
解決問題并不丟人,誰遇到問題,都會去查查百度谷歌,更何況是高壓下的面試場景。但你不要嘗試去找面試官要答案,應該把自己對問題的分析思路講出來,讓面試官來評價是否正確。如果正確,再繼續下一步的分析;如果不正確,就可以快速止損,避免時間浪費。
**第三種可能性:你理解了問題,但毫無頭緒,解決思路一點都沒有**
這就比較悲觀了。 此時你更應該在最開始就跟面試官反饋。你可以讓面試官給予一些提示,這樣也許你很快就能找到解決思路了。如果實在是對這個問題很陌生,沒有信心,也可以向面試官反饋,希望更換一道面試題。
你要知道,對于一個有經驗的面試官而言,更換面試題太正常不過了。一道題正好戳中求職者的知識盲區,這是很正常的事情。更換題目,不丟人。
總而言之,當你在手寫代碼環節遇到困難時,不可以過度浪費時間而悶頭苦思冥想,這樣你就在浪費面試官的寶貴時間。相反,你應該盡早向面試官反饋自己遇到的困難,并尋求討論、確認或者提示。這樣,對于彼此的效率都是最高的,也是工作過程中遇到問題的最優解決方案。你可以設想一下,在工作中遇到問題,也應該第一時間向領導反饋尋求幫助。
最后,如果你真的遇到一個完全陌生的問題,那么就更要第一時間反饋給面試官,尋求更換另一個題目。永遠牢記一點,遇到不會的,第一時間反饋,這并不丟人。相反,這是明智的選擇,反映的是你遇到問題后解決方式的選擇和判斷。
#### 總結
好的,這一課時的內容就到這里了。在這一課時的內容中,我們反復強調的一點是,不丟人。遇到困難不丟人,誰工作不遇到點困難呢。遇到困難求助他人給一點提示不丟人,遇到困難不找人幫忙悶頭苦想才是錯誤的。遇到我們不懂的問題選擇更換一道題目,這并不是在逃避問題;反之,更是在當時被動的情況下,做出的最優選擇。
在面試求職的過程中,你是否也遇到過問題答不上來的尷尬狀況?還記不記得你是如何解決處理的?歡迎在評論區留言,和大家分享你的面試經歷。
- 前言
- 開篇詞
- 數據結構與算法,應該這樣學!
- 模塊一:代碼效率優化方法論
- 01復雜度:如何衡量程序運行的效率?
- 02 數據結構:將“昂貴”的時間復雜度轉換成“廉價”的空間復雜度
- 模塊二:數據結構基礎
- 03 增刪查:掌握數據處理的基本操作,以不變應萬變
- 04 如何完成線性表結構下的增刪查?
- 05 棧:后進先出的線性表,如何實現增刪查?
- 06 隊列:先進先出的線性表,如何實現增刪查?
- 07 數組:如何實現基于索引的查找?
- 08 字符串:如何正確回答面試中高頻考察的字符串匹配算法?
- 09 樹和二叉樹:分支關系與層次結構下,如何有效實現增刪查?
- 10 哈希表:如何利用好高效率查找的“利器”?
- 模塊三:算法思維基礎
- 11 遞歸:如何利用遞歸求解漢諾塔問題?
- 12 分治:如何利用分治法完成數據查找?
- 13 排序:經典排序算法原理解析與優劣對比
- 14 動態規劃:如何通過最優子結構,完成復雜問題求解?
- 模塊四:面試真題 = 實踐問題的“縮影”
- 15 定位問題才能更好地解決問題:開發前的復雜度分析與技術選型
- 16 真題案例(一):算法思維訓練
- 17真題案例(二):數據結構訓練
- 18 真題案例(三):力扣真題訓練
- 19 真題案例(四):大廠真題實戰演練
- 特別放送:面試現場
- 20 代碼之外,技術面試中你應該具備哪些軟素質?
- 21 面試中如何建立全局觀,快速完成優質的手寫代碼?
- 結束語
- 結束語 勤修內功,構建你的核心競爭力