1. 程式人生 > >最難的不是遞迴,是這場面試的有緣無分

最難的不是遞迴,是這場面試的有緣無分

## 序言 我第一次接觸遞迴,是在大三的時候。 原諒我,我不是計算機專業學生,大三才開始自學程式碼。 還記得當時的題目是:一隻猴想摘樹上的桃,他可以一次摘1個,也可以一次摘2個,總共n個桃,他有多少種摘法? 明顯遞迴可以完美解決,但是當時我想了好幾個小時都沒想出思路。 那一夜,我就感覺自己就是那條猴。 ## 一 幾年以後,我已經刷了好幾遍的《劍指offer》,背了幾十道leetcode原題,我相信我已經不是當年的那個猴了。 而今天,也是到一家新公司面試。 我相信,以我精湛的演技,刻苦的記憶,深深印在心中類似JVM原理這樣的屠龍之技,即便客場作戰,我仍可打通三場技術面試,直達HR之面。 想到這裡,我身上的格子衫彷彿更正了一些。 臨走前,我又默寫了一遍氣泡排序,沒有問題。 一切都剛剛好。 ## 二 到達面試公司後,HR領我穿過層層工位,我一邊打量未來我的同事一邊感覺自己來到了菜市場,到處是產品和程式設計師關於排期的討價還價。 在面試室等待片刻後,面試官來了。 應該是昨晚加班了,面試官頭髮都是蓬鬆的,螢幕也是淡黃色的,估計開了護眼模式。 一邊看我簡歷,一邊在工作群裡瘋狂輸出。 "淡黃的長群,蓬鬆的頭髮",突然感覺這個rap好應景,好好笑,我不禁笑了起來。 面試官一臉懵逼的看著我:"我們可以開始面試了嗎?" 我才反應過來,忙說可以可以。 面試官給了我幾張白紙,說估計一會用得著。 又是熟悉的徒手寫演算法,這個我在家練了很久了,應該問題不大。 面試官問題到:"你知道遞迴嗎?" 一剎那我又回到被猴子支配的那個夜晚,不過我現在早已進化了,並且有了自己的思考。 於是面露微笑,答道:"知道啊,其實按照我的理解,遞迴就好像人生。 人一生都在追求很多東西,比如財富、健康、親情、愛情,財富又可以來自於主業、副業。 主業要想幹好又需求文憑、努力、人脈等等。 有些人呢就會好像遞迴,一直追求目標下的主要選項,比如一直追求財富,然後一直想幹好主業,進而把所有精力又到放到文憑,一直遞下去,卻不知道,函式棧太多,這樣下去歸來已不是少年。" 面試官直愣愣看著我:"好清新脫俗的解釋,可是我們又不是HR面試,還不需要談人生。簡而言之,你能用一句話說什麼是遞迴嗎?" 我尷尬笑了笑,說:"函式呼叫自身。" 面試官:"這麼簡單的事說的這麼麻煩。那行,我給你出個演算法。" > 一隻青蛙一次可以跳上1級臺階,也可以跳上2級臺階。求該青蛙跳上一個 n 級的臺階總共有多少種跳法。 我一看,這不是當年的題目嗎? 激動的心,顫抖的手。 Talk is cheap,Code 給你show show。 於是,我不到三十秒就寫完了程式碼。 ```java public class Solution { public int JumpFloor(int target) { if(target == 1){ return 1; }else if(target == 2){ return 2; }else{ return JumpFloor(target - 1) + JumpFloor(target -2); } } } ``` 面試官一臉錯愕的看著我,我突然意識到了什麼。 我知道自己刷過這道題,面試官也知道了我刷過這道題,我也知道面試官知道我刷過這道題,但是我還想找補一下,我其實是天賦異稟,天縱之才,這個答案是我花了三秒鐘思考出來的。 但是顯然來不及了,面試官看了一下,直接說沒問題,然後開始了另外一道演算法。 > 請完成一個函式,輸入一個二叉樹,該函式輸出它的映象。 ![](https://gitee.com/hanqier/picture/raw/master/2021-3-8/1615176271037-image.png) 忍不住感嘆今天運氣真好,連續兩次刷到原題。 只不過,我肯定不能像剛才那樣,不然那也太尷尬了。演算法面試可是考驗智力的,都快整成考記憶力的了。 面試官估計也是這樣想的,說道:"這樣吧,先不著急寫程式碼,你說下遞迴一般問題的常見思路,然後結合這道題目,一點點來分析"。 這也不怕,我頓了一下,說道: "遞迴問題一般都是有套路的,按照我的理解,主要分為三步 1. 確定遞迴函式的引數和返回值 本道題中,引數肯定就是root節點,返回值可需要可不需要,因為返回的話也是該root節點。 那問題要求返回,那就函式的返回型別為TreeNode*。 即 ```java public TreeNode invertTree(TreeNode root) ``` 2. 確定終止條件 當前節點為空的時候,無法反轉映象,所以返回。 ```java if (root == null) { return root; } ``` 3. 確定單層遞迴的邏輯 因為是先前序遍歷,所以先進行交換左右孩子節點,然後反轉左子樹,反轉右子樹。 ```java TreeNode temp = root.left; root.left = root.right; root.right = temp; invertTree(root.left); invertTree(root.right); return root; ``` 完整的即為 ```java public class Solution { /** * 翻轉二叉樹 * @param root 二叉樹的根 * @return */ public TreeNode invertTree(TreeNode root) { if (root == null) { return root; } TreeNode temp = root.left; root.left = root.right; root.right = temp; invertTree(root.left); invertTree(root.right); return root; } } ``` 面試官充滿讚賞的點了點頭,隨後又聊了些什麼“負載均衡”,什麼“設計模式”之類的,引得我逐漸放鬆起來,面試室裡充滿了快活的空氣。 差不多聊了一個小時,畢竟才是一面,當前也差不多,臨走前面試官還加了我的微信,感覺基本能過。 ## 三 可能太激動了,最近面試的也太多了,最後的對話確實有點尷尬,朋友們幫我看看,我還能過嗎? ![](https://gitee.com/hanqier/picture/raw/master/2021-3-8/1615176919742-image.png) 我突然覺得自己好像掛了。。。 ### 您的關注、點贊、在看、分享是我創作的最大動力! > 創過業,賠過錢。遂轉行,程式設計師。 > > 從外包,到大廠。寫程式碼,寫文章。 > > 胡思亂想,文章沙雕。 > > 歡迎關注,與君同好。 > > ![](https://gitee.com/hanqier/picture/raw/master/2021-3-8/1615192924895-image.png)