我第一次接觸遞歸,是在大三的時候。java
原諒我,我不是計算機專業學生,大三才開始自學代碼。程序員
還記得當時的題目是:一隻猴想摘樹上的桃,他能夠一次摘1個,也能夠一次摘2個,總共n個桃,他有多少種摘法?面試
明顯遞歸能夠完美解決,可是當時我想了好幾個小時都沒想出思路。算法
那一晚上,我就感受本身就是那條猴。設計模式
幾年之後,我已經刷了好幾遍的《劍指offer》,背了幾十道leetcode原題,我相信我已經不是當年的那個猴了。微信
而今天,也是到一家新公司面試。負載均衡
我相信,以我精湛的演技,刻苦的記憶,深深印在心中相似JVM原理這樣的屠龍之技,即使客場做戰,我仍可打通三場技術面試,直達HR之面。函數
想到這裏,我身上的格子衫彷彿更正了一些。設計
臨走前,我又默寫了一遍冒泡排序,沒有問題。code
一切都剛恰好。
到達面試公司後,HR領我穿過層層工位,我一邊打量將來個人同事一邊感受本身來到了菜市場,處處是產品和程序員關於排期的討價還價。
在面試室等待片刻後,面試官來了。
應該是昨晚加班了,面試官頭髮都是蓬鬆的,屏幕也是淡黃色的,估計開了護眼模式。
一邊看我簡歷,一邊在工做羣裏瘋狂輸出。
"淡黃的長羣,蓬鬆的頭髮",忽然感受這個rap好應景,好可笑,我不由笑了起來。
面試官一臉懵逼的看着我:"咱們能夠開始面試了嗎?"
我才反應過來,忙說能夠能夠。
面試官給了我幾張白紙,說估計一會用得着。
又是熟悉的徒手寫算法,這個我在家練了好久了,應該問題不大。
面試官問題到:"你知道遞歸嗎?"
一剎那我又回到被猴子支配的那個夜晚,不過我如今早已進化了,而且有了本身的思考。
因而面露微笑,答道:"知道啊,其實按照個人理解,遞歸就好像人生。
人一輩子都在追求不少東西,好比財富、健康、親情、愛情,財富又能夠來自於主業、副業。
主業要想幹好又需求文憑、努力、人脈等等。
有些人呢就會好像遞歸,一直追求目標下的主要選項,好比一直追求財富,而後一直想幹好主業,進而把全部精力又到放到文憑,一直遞下去,殊不知道,函數棧太多,這樣下去歸來已不是少年。"
面試官直愣愣看着我:"好清新脫俗的解釋,但是咱們又不是HR面試,還不須要談人生。簡而言之,你能用一句話說什麼是遞歸嗎?"
我尷尬笑了笑,說:"函數調用自身。"
面試官:"這麼簡單的事說的這麼麻煩。那行,我給你出個算法。"
一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級臺階。求該青蛙跳上一個 n 級的臺階總共有多少種跳法。
我一看,這不是當年的題目嗎?
激動的心,顫抖的手。
Talk is cheap,Code 給你show show。
因而,我不到三十秒就寫完了代碼。
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); } } }
面試官一臉錯愕的看着我,我忽然意識到了什麼。
我知道本身刷過這道題,面試官也知道了我刷過這道題,我也知道面試官知道我刷過這道題,可是我還想找補一下,我實際上是天賦異稟,天縱之才,這個答案是我花了三秒鐘思考出來的。
可是顯然來不及了,面試官看了一下,直接說沒問題,而後開始了另一道算法。
請完成一個函數,輸入一個二叉樹,該函數輸出它的鏡像。
忍不住感嘆今天運氣真好,連續兩次刷到原題。
只不過,我確定不能像剛纔那樣,否則那也太尷尬了。算法面試但是考驗智力的,都快整成考記憶力的了。
面試官估計也是這樣想的,說道:"這樣吧,先不着急寫代碼,你說下遞歸通常問題的常見思路,而後結合這道題目,一點點來分析"。
這也不怕,我頓了一下,說道:
"遞歸問題通常都是有套路的,按照個人理解,主要分爲三步
本道題中,參數確定就是root節點,返回值可須要可不須要,由於返回的話也是該root節點。
那問題要求返回,那就函數的返回類型爲TreeNode*。
即
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;
完整的即爲
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; } }
面試官充滿讚揚的點了點頭,隨後又聊了些什麼「負載均衡」,什麼「設計模式」之類的,引得我逐漸放鬆起來,面試室裏充滿了快活的空氣。
差很少聊了一個小時,畢竟纔是一面,當前也差很少,臨走前面試官還加了個人微信,感受基本能過。
可能太激動了,最近面試的也太多了,最後的對話確實有點尷尬,朋友們幫我看看,我還能過嗎?
我忽然以爲本身好像掛了。。。
創過業,賠過錢。遂轉行,程序員。
從外包,到大廠。寫代碼,寫文章。
胡思亂想,文章沙雕。
歡迎關注,與君同好。