摘要:那其實(shí)這個(gè)問題還可以換個(gè)問法實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)數(shù)字能返回斐波那契數(shù)列的第個(gè)值。文章預(yù)告更多的前端面試分享我都會(huì)第一時(shí)間更新在我的公眾號(hào)閏土大叔里面,歡迎關(guān)注
面試攢經(jīng)驗(yàn),let"s go!
值此高考來臨之際,閑不住的我又雙叒叕出發(fā)去面試攢經(jīng)驗(yàn)了,去了公司交待一番流程后,面試官甩給了我一張A4紙,上面寫著一道js算法筆試題(一開始我并不知道這是在考察js算法),上面寫著“1、1、2、3、5、8......,求第n個(gè)數(shù)的值”
不得不承認(rèn),當(dāng)時(shí)我第一眼看這道題大腦里是懵逼的。后來才想起來,這不就是數(shù)學(xué)題里的那個(gè)斐波那契(肥婆納妾)數(shù)列么!從第三個(gè)數(shù)開始,每個(gè)數(shù)都是前兩個(gè)數(shù)的和。
能get到這個(gè)點(diǎn),你已經(jīng)成功了一半了。另一半就是需要你將數(shù)學(xué)公式邏輯轉(zhuǎn)變成js程序邏輯。
那其實(shí)這個(gè)問題還可以換個(gè)問法:實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)數(shù)字n能返回斐波那契數(shù)列的第n個(gè)值。
分析思路首先,思路很重要,讓我們一起來分析一下,大概的思路是這樣的:
首先我們要把特殊的部分給獨(dú)立出來做個(gè)判斷,哪些數(shù)字是特殊的呢?很明顯是斐波那契數(shù)列的前兩項(xiàng),而斐波那契數(shù)列的前兩項(xiàng)都為1。然后定義三個(gè)變量,firstNum、secondNum、total,分別代表著第一個(gè)數(shù)字,第二個(gè)數(shù)字,還有他們倆之和。
然后通過一個(gè)for循環(huán)遍歷,將firstNum加上secondNum的結(jié)果賦值給total,然后將secondNum的value賦值給firstNum,把total的value賦值給secondNum,以此根據(jù)傳入的n來不斷地循環(huán)疊加,達(dá)到想要的total值,最后return返回出去。
思路說完后,讓我們用js把它實(shí)現(xiàn)出來:
// 可能是最普通的解法 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; }面試題的最優(yōu)解
記住,面試官與咱們應(yīng)聘者的思維不同,你應(yīng)聘的時(shí)候你大部分時(shí)間是在想,這道題我會(huì)不會(huì)做,能不能做出來,而他們想的是這道題的最優(yōu)解。
前端的工作,“最優(yōu)解”其實(shí)是一種自我追求進(jìn)步的表現(xiàn)。
除了以上這種辦法,還有什么更好的解決辦法嗎?答案是有的。
先來看看迭代的解法
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));
究竟哪個(gè)才是最優(yōu)解,相信看完文章的你們已經(jīng)有了答案。
可能你們會(huì)問:
那閏土你在筆試時(shí)做出來了么?
你猜~寫在后面
目前為止我也參加過很多次大大小小的前端面試,確實(shí)也聽說過有不少面試官會(huì)問到一些算法。通常會(huì)涉及的,是鏈表、樹、字符串、數(shù)組相關(guān)的知識(shí)。前端面試對(duì)算法要求不高,似乎已經(jīng)是業(yè)內(nèi)的一種共識(shí)了。雖說算法好的前端面試肯定會(huì)加分,但是僅憑常見的面試題,而不去聯(lián)系需求,很難讓人覺得,算法對(duì)于前端真的很重要。
直到有這么一天,太原這家公司的前端leader給我出了這么一道js算法題之后,還跟我聊了很多內(nèi)容,與我固有的思維產(chǎn)生了強(qiáng)烈的碰撞。面試官還跟我講,他們公司的技術(shù)總監(jiān)是微軟出身,很注重算法這塊,他當(dāng)初應(yīng)聘進(jìn)來的時(shí)候,也是考察的算法。
雖然這次面試被pass了,但是我認(rèn)為工程師都應(yīng)該學(xué)習(xí)算法,我覺得那不僅僅是對(duì)軟件工程思想的培養(yǎng),更是一種對(duì)心智的鍛煉。
文章預(yù)告:更多的前端面試分享我都會(huì)第一時(shí)間更新在我的公眾號(hào)<閏土大叔>里面,歡迎關(guān)注!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108040.html
摘要:前言在計(jì)算機(jī)領(lǐng)域,記憶是主要用于加速程序計(jì)算的一種優(yōu)化技術(shù),它使得函數(shù)避免重復(fù)演算之前已被處理過的輸入,而返回已緩存的結(jié)果。被執(zhí)行了不是素?cái)?shù),其他數(shù)字默認(rèn)是素?cái)?shù)。我們可以看出,如果從開始打印斐波那契數(shù)列,函數(shù)被執(zhí)行了次。 前言 在計(jì)算機(jī)領(lǐng)域,記憶(memoization)是主要用于加速程序計(jì)算的一種優(yōu)化技術(shù),它使得函數(shù)避免重復(fù)演算之前已被處理過的輸入,而返回已緩存的結(jié)果。 -- wi...
摘要:所謂遞歸其實(shí)就是函數(shù)本身調(diào)用函數(shù),直到滿足指定條件之后一層層退出函數(shù),例如從前有座山,山里有座廟,廟里有個(gè)老和尚,正在給小和尚講故事呢故事是什么呢從前有座山,山里有座廟,廟里有個(gè)老和尚,正在給小和尚講故事呢故事是什么呢從前有座山,山里有座廟 所謂遞歸其實(shí)就是函數(shù)本身調(diào)用函數(shù),直到滿足指定條件之后一層層退出函數(shù), 例如 從前有座山,山里有座廟,廟里有個(gè)老和尚,正在給小和尚講故事呢!故事是...
摘要:根據(jù)該規(guī)則,返回第個(gè)斐波那契數(shù)。尾遞歸函數(shù)調(diào)用自身,稱為遞歸。一個(gè)前端眼中的斐波那契數(shù)列解斐波那契數(shù)列的實(shí)用解法調(diào)用棧尾遞歸和手動(dòng)優(yōu)化尾調(diào)用優(yōu)化譯我從用寫斐波那契生成器中學(xué)到的令人驚訝的件事 斐波那契數(shù)列是以下一系列數(shù)字: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, ... 在種子數(shù)字 0 和 1 ...
摘要:為什么是斐波那契談到生成器迭代器,人們總是喜歡用斐波那契數(shù)列來舉例。那么,換句話來說,即能由推導(dǎo)式得出的數(shù)列,其實(shí)都可以用來做生成器迭代器的例子。然而,生成器和生成器類的實(shí)例都屬于迭代器。 Python有什么好學(xué)的這句話可不是反問句,而是問句哦。 主要是煎魚覺得太多的人覺得Python的語法較為簡(jiǎn)單,寫出來的代碼只要符合邏輯,不需要太多的學(xué)習(xí)即可,即可從一門其他語言跳來用Python寫...
摘要:與堆棧區(qū)別隊(duì)列的操作方式和堆棧類似,唯一的區(qū)別在于隊(duì)列只允許新數(shù)據(jù)在后端進(jìn)行添加。移除隊(duì)列的第一項(xiàng),并返回被移除的元素。三使用隊(duì)列計(jì)算斐波那契數(shù)列的第項(xiàng)。前兩項(xiàng)固定為,后面的項(xiàng)為前兩項(xiàng)之和,依次向后。 showImg(https://segmentfault.com/img/remote/1460000019005270); 這是第二周的練習(xí)題,這里補(bǔ)充下咯,五一節(jié)馬上就要到了,自己的...
閱讀 2472·2021-11-16 11:44
閱讀 884·2021-09-10 11:16
閱讀 2257·2019-08-30 15:54
閱讀 1093·2019-08-30 15:53
閱讀 1931·2019-08-30 13:00
閱讀 639·2019-08-29 17:07
閱讀 3538·2019-08-29 16:39
閱讀 3161·2019-08-29 13:30