摘要:那其實這個問題還可以換個問法實現一個函數,輸入一個數字能返回斐波那契數列的第個值。文章預告更多的前端面試分享我都會第一時間更新在我的公眾號閏土大叔里面,歡迎關注
面試攢經驗,let"s go!
值此高考來臨之際,閑不住的我又雙叒叕出發去面試攢經驗了,去了公司交待一番流程后,面試官甩給了我一張A4紙,上面寫著一道js算法筆試題(一開始我并不知道這是在考察js算法),上面寫著“1、1、2、3、5、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; }面試題的最優解
記住,面試官與咱們應聘者的思維不同,你應聘的時候你大部分時間是在想,這道題我會不會做,能不能做出來,而他們想的是這道題的最優解。
前端的工作,“最優解”其實是一種自我追求進步的表現。
除了以上這種辦法,還有什么更好的解決辦法嗎?答案是有的。
先來看看迭代的解法
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了,但是我認為工程師都應該學習算法,我覺得那不僅僅是對軟件工程思想的培養,更是一種對心智的鍛煉。
文章預告:更多的前端面試分享我都會第一時間更新在我的公眾號<閏土大叔>里面,歡迎關注!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108040.html
摘要:前言在計算機領域,記憶是主要用于加速程序計算的一種優化技術,它使得函數避免重復演算之前已被處理過的輸入,而返回已緩存的結果。被執行了不是素數,其他數字默認是素數。我們可以看出,如果從開始打印斐波那契數列,函數被執行了次。 前言 在計算機領域,記憶(memoization)是主要用于加速程序計算的一種優化技術,它使得函數避免重復演算之前已被處理過的輸入,而返回已緩存的結果。 -- wi...
摘要:所謂遞歸其實就是函數本身調用函數,直到滿足指定條件之后一層層退出函數,例如從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢故事是什么呢從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢故事是什么呢從前有座山,山里有座廟 所謂遞歸其實就是函數本身調用函數,直到滿足指定條件之后一層層退出函數, 例如 從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢!故事是...
摘要:根據該規則,返回第個斐波那契數。尾遞歸函數調用自身,稱為遞歸。一個前端眼中的斐波那契數列解斐波那契數列的實用解法調用棧尾遞歸和手動優化尾調用優化譯我從用寫斐波那契生成器中學到的令人驚訝的件事 斐波那契數列是以下一系列數字: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, ... 在種子數字 0 和 1 ...
摘要:為什么是斐波那契談到生成器迭代器,人們總是喜歡用斐波那契數列來舉例。那么,換句話來說,即能由推導式得出的數列,其實都可以用來做生成器迭代器的例子。然而,生成器和生成器類的實例都屬于迭代器。 Python有什么好學的這句話可不是反問句,而是問句哦。 主要是煎魚覺得太多的人覺得Python的語法較為簡單,寫出來的代碼只要符合邏輯,不需要太多的學習即可,即可從一門其他語言跳來用Python寫...
摘要:與堆棧區別隊列的操作方式和堆棧類似,唯一的區別在于隊列只允許新數據在后端進行添加。移除隊列的第一項,并返回被移除的元素。三使用隊列計算斐波那契數列的第項。前兩項固定為,后面的項為前兩項之和,依次向后。 showImg(https://segmentfault.com/img/remote/1460000019005270); 這是第二周的練習題,這里補充下咯,五一節馬上就要到了,自己的...
閱讀 2411·2021-11-16 11:44
閱讀 848·2021-09-10 11:16
閱讀 2224·2019-08-30 15:54
閱讀 1042·2019-08-30 15:53
閱讀 1894·2019-08-30 13:00
閱讀 615·2019-08-29 17:07
閱讀 3509·2019-08-29 16:39
閱讀 3135·2019-08-29 13:30