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