值此高考來臨之際,閒不住的我又雙叒叕出發去面試攢經驗了,去了公司交待一番流程後,面試官甩給了我一張A4紙,上面寫着一道js算法筆試題(一開始我並不知道這是在考察js算法),上面寫着「一、一、二、三、五、8......,求第n個數的值」前端
不得不認可,當時我第一眼看這道題大腦裏是懵逼的。後來纔想起來,這不就是數學題裏的那個斐波那契(肥婆納妾)數列麼!從第三個數開始,每一個數都是前兩個數的和。面試
能get到這個點,你已經成功了一半了。另外一半就是須要你將數學公式邏輯轉變成js程序邏輯。算法
那其實這個問題還能夠換個問法:實現一個函數,輸入一個數字n能返回斐波那契數列的第n個值。數組
首先,思路很重要,讓咱們一塊兒來分析一下,大概的思路是這樣的:函數
首先咱們要把特殊的部分給獨立出來作個判斷,哪些數字是特殊的呢?很明顯是斐波那契數列的前兩項,而斐波那契數列的前兩項都爲1。而後定義三個變量,firstNum、secondNum、total,分別表明着第一個數字,第二個數字,還有他們倆之和。
而後經過一個for循環遍歷,將firstNum加上secondNum的結果賦值給total,而後將secondNum的value賦值給firstNum,把total的value賦值給secondNum,以此根據傳入的n來不斷地循環疊加,達到想要的total值,最後return返回出去。
思路說完後,讓咱們用js把它實現出來:學習
// 多是最普通的解法 var series = function (n) { var sum = [0, 1]; if(n < 2) { return sum[n]; } var firstNum = 0; var secondNum = 1; var total = 0; for (var i = 2; i<= n; i++) { total = firstNum + secondNum; firstNum = secondNum; secondNum = total; } return total; }
記住,面試官與我們應聘者的思惟不一樣,你應聘的時候你大部分時間是在想,這道題我會不會作,能不能作出來,而他們想的是這道題的最優解。spa
前端的工做,「最優解」實際上是一種自我追求進步的表現。code
除了以上這種辦法,還有什麼更好的解決辦法嗎?答案是有的。遞歸
先來看看迭代的解法圖片
var series = function (n) { var feipo = [0,1]; for(var i=2;i<=n;i++){ feipo[i] = feipo[i-1] + feipo[i-2] } return feipo[n]; } // console.log(series(6));
再來看看遞歸的解法
var series = function (n) { if(n >= 2) { return series(n-1) + series(n-2) }else { return n; } } // console.log(series(6));
究竟哪一個纔是最優解,相信看完文章的大家已經有了答案。
可能大家會問:
那閏土你在筆試時作出來了麼?
你猜~
目前爲止我也參加過不少次大大小小的前端面試,確實也據說過有很多面試官會問到一些算法。一般會涉及的,是鏈表、樹、字符串、數組相關的知識。前端面試對算法要求不高,彷佛已是業內的一種共識了。雖然說算法好的前端面試確定會加分,可是僅憑常見的面試題,而不去聯繫需求,很難讓人以爲,算法對於前端真的很重要。
直到有這麼一天,太原這家公司的前端leader給我出了這麼一道js算法題以後,還跟我聊了不少內容,與我固有的思惟產生了強烈的碰撞。面試官還跟我講,他們公司的技術總監是微軟出身,很注重算法這塊,他當初應聘進來的時候,也是考察的算法。
雖然此次面試被pass了,可是我認爲工程師都應該學習算法,我以爲那不只僅是對軟件工程思想的培養,更是一種對心智的鍛鍊。
文章預告:更多的前端面試分享我都會第一時間更新在個人公衆號<閏土大叔>裏面,歡迎關注!