有趣的面試題
面試題目:
有n個(gè)數(shù),n-1個(gè)重復(fù)偶數(shù)次,1個(gè)出現(xiàn)奇數(shù)次,怎么找出出現(xiàn)奇數(shù)次的那個(gè)數(shù)
這個(gè)問(wèn)題是一個(gè)同事面試時(shí)問(wèn)到的題目,我覺(jué)得很有趣,就拿來(lái)自己用了,題目的答案在最下面。
在看這個(gè)問(wèn)題前,先聊聊一個(gè)前端面試一個(gè)問(wèn)題
前端面試是否考察算法
大概2年前,我在微博上面看到兩位大牛的爭(zhēng)論:
@pureFE對(duì)@真阿當(dāng) 說(shuō):阿當(dāng)哥你好:我是一名在校學(xué)生,文科專(zhuān)業(yè)。前一段找實(shí)習(xí)的過(guò)程中注意到一些公司有算法要求。對(duì)于前端來(lái)說(shuō),專(zhuān)業(yè)知識(shí)的補(bǔ)習(xí)路線(xiàn)應(yīng)該如何安排,應(yīng)該像計(jì)算機(jī)專(zhuān)業(yè)那樣從C、數(shù)據(jù)結(jié)構(gòu)等等開(kāi)始嗎?對(duì)于前端開(kāi)發(fā)者來(lái)說(shuō),專(zhuān)業(yè)知識(shí)應(yīng)該達(dá)到何種程度才是合格?不知您能否指點(diǎn)一二,感激不盡!
@真阿當(dāng): 前端在實(shí)戰(zhàn)中對(duì)算法和數(shù)據(jù)結(jié)構(gòu)幾乎沒(méi)有要求,在你當(dāng)下的境況學(xué)習(xí)這些知識(shí)對(duì)你找工作一點(diǎn)幫助也沒(méi)有。前端開(kāi)發(fā)的門(mén)檻低,所以有很多非科班出身的人從這個(gè)領(lǐng)域進(jìn)入IT圈,你無(wú)需為“非科班出身”背上壓力。為找工作的話(huà),建議最快的路線(xiàn)是:先學(xué)css、后學(xué)一些基礎(chǔ)js書(shū)……
@寒冬winter:100%反對(duì)。
回復(fù)@真阿當(dāng): 阿當(dāng)你經(jīng)常說(shuō)前端工程師應(yīng)該團(tuán)結(jié)起來(lái)加強(qiáng)影響力,你就是這么讓大家加強(qiáng)的么?沒(méi)有算法能力,前端工程師怎么去實(shí)現(xiàn)新的交互效果?沒(méi)有數(shù)據(jù)結(jié)構(gòu)知識(shí),前端工程師怎么處理大數(shù)據(jù)?沒(méi)有這樣的能力,前端怎么去承擔(dān)更重要的職責(zé)?
@真阿當(dāng):算了,不爭(zhēng)了,我該表達(dá)的都表達(dá)完了。求同存異。我的言論也只代表我個(gè)人看法,不保證一定是對(duì)的,各人有各人自己認(rèn)同的發(fā)展路線(xiàn)。更傾向于哪種觀(guān)點(diǎn),決策權(quán)在諸位自己手上,冷暖自知誰(shuí)也替不了你。不要?jiǎng)硬粍?dòng)就“誤人子弟”帽子扣下來(lái),我擔(dān)不起,也不想擔(dān)。一家之言,說(shuō)的是自己的真實(shí)感想。到此為止
@真阿當(dāng)回復(fù)@糕富帥是我的人生理想:恩,是的,我說(shuō)過(guò)要想前端能走得遠(yuǎn)一些,至少用原生js鍛煉半年以上。我說(shuō)的是“如何成為一個(gè)高級(jí)工程師”,而不是“如何跨入門(mén)檻”。絕大多數(shù)公司在面試時(shí)只會(huì)看這個(gè)人“在這個(gè)領(lǐng)域的基本功”怎么樣,過(guò)不了這一關(guān),跨不過(guò)入行的門(mén)檻。所以要先學(xué)會(huì)怎么通過(guò)面試。
@寒冬winter:目前為止我好像沒(méi)聽(tīng)說(shuō)哪個(gè)前端因?yàn)閷W(xué)習(xí)計(jì)算機(jī)基礎(chǔ)知識(shí)耽誤了專(zhuān)業(yè)技能,從當(dāng)年51js我認(rèn)識(shí)的人來(lái)看,基礎(chǔ)好的無(wú)一例外幾年后立于行業(yè)頂點(diǎn),而那些"順應(yīng)市場(chǎng)"的人,不知去了哪里。實(shí)際上,這只關(guān)乎人的素質(zhì),舍棄了基礎(chǔ)節(jié)約的時(shí)間并不能用于其它知識(shí)或者英語(yǔ)。
我這邊的答案也是需要的,直接舉一些例子:
最近很火的框架reactjs,他的核心就是實(shí)現(xiàn)了一個(gè)虛擬dom,每次頁(yè)面的更新都能通過(guò)虛擬dom計(jì)算出最小變更內(nèi)容,從而達(dá)到頁(yè)面高效的刷新,實(shí)現(xiàn)最小diff的算法很關(guān)鍵
騰訊在手機(jī)web上實(shí)現(xiàn)了利用localstorage存儲(chǔ)js,然后js實(shí)現(xiàn)增量更新的算法,達(dá)到每次刷新僅僅請(qǐng)求變更了的js內(nèi)容,這樣就解決了手機(jī)端流量寶貴和網(wǎng)速慢的問(wèn)題,實(shí)現(xiàn)增量更新的算法很關(guān)鍵
我剛來(lái)百度時(shí),組內(nèi)有一位echart的貢獻(xiàn)者,在一次組內(nèi)分享中,一個(gè)大數(shù)據(jù)量?jī)?chǔ)存的優(yōu)化的問(wèn)題,大概是下面這樣的數(shù)
[100001, 100002, 100003 ...]
在通過(guò)canvas繪圖時(shí),會(huì)比較費(fèi)內(nèi)存,然后他就使用時(shí)間換空間的方式處理如下
[1, 2, 3 ...] 設(shè)定base 是100000
這樣就解決了一定數(shù)據(jù)量?jī)?nèi)存過(guò)大的'問(wèn)題。
我覺(jué)得上面的例子就足夠支撐算法在前端的重要性了,因?yàn)楝F(xiàn)在的前端不在僅僅是還原一些UI設(shè)計(jì),做做交互了,實(shí)現(xiàn)一些功能了。
現(xiàn)在的前端越來(lái)越復(fù)雜,涉及面越來(lái)越多,向后延生可以利用nodejs去做服務(wù)端(全棧工程師);平行延生可以用react native去做native的開(kāi)發(fā);縱向延生,也會(huì)考慮webapp內(nèi)存泄露,性能調(diào)優(yōu),打包編譯,線(xiàn)上部署等等。
這些東西研究的越深,對(duì)于計(jì)算機(jī)基礎(chǔ)知識(shí)的要求就越高,當(dāng)然其中就包含了算法基礎(chǔ)。
那么問(wèn)題來(lái)了,如果我們對(duì)于算法沒(méi)有基礎(chǔ)怎么辦,其實(shí)我開(kāi)始就是對(duì)算法沒(méi)有什么研究,也不知道怎么運(yùn)用在工作中,只是后來(lái)的工作中,慢慢發(fā)現(xiàn)自己對(duì)于計(jì)算機(jī)一些基礎(chǔ)的匱乏,根據(jù)需要一點(diǎn)點(diǎn)補(bǔ)充的。
第一次在前端接觸簡(jiǎn)單的算法是在看一個(gè)桌球游戲的源碼時(shí),游戲里面球的碰撞,反彈,加速度等,都是一些簡(jiǎn)單的計(jì)算和物理知識(shí),挺有趣的
游戲github地址,我加了一些注釋
https://github.com/tangguangyao/Snooker
回到面試題,我們可以聊聊這個(gè)題目為什么我覺(jué)得挺不錯(cuò)的
1. 如果沒(méi)有算法基礎(chǔ)的人,如果思維不錯(cuò),至少能夠在一定時(shí)間內(nèi)給出一個(gè)比較笨的解決方案,然后給與一些提示,能夠引導(dǎo)到我期望的答案
2. 對(duì)于有算法基礎(chǔ)的人,能夠大概說(shuō)出幾種解決方案,在我們余下的溝通中,回答一個(gè)我期望的答案,甚至更好的答案
【有趣的面試題】相關(guān)文章:
世界500強(qiáng)有趣味面試題03-01
護(hù)士的面試題09-15
深圳海關(guān)的面試題04-12
企業(yè)計(jì)劃的面試題04-11
群碩的面試題04-11
谷歌的面試題目04-11
知名IT企的面試題04-11
金山的面試題目04-11
面試題的回答技巧03-29
刁鉆的面試題指導(dǎo)10-08