『壹』 面試題目 演算法 一天兩天 總共多少中情況
面試中純粹考演算法的問題一般是讓很多程序員朋友痛恨的,這里分享下我對於解答演算法題的一些思路和技巧。
一般關於演算法的文章,都是從經典演算法講起,一種一種演算法介紹,見得演算法多了,自然就有了感悟,但如此學習花費的時間和精力卻是過於巨大,也不適合在博客裡面交流。這一篇文,卻是專門講快捷思路的,很多人面對演算法題的時候幾乎是腦子里一片空白,這一篇文章講的就是從題目下手,把毫無思路的題目打開一個缺口的幾種常見技巧。
(一)由簡至繁
事實上,很多問題確實是很難在第一時間內得到正確的思路的,這時候可以嘗試一種由簡至繁的思路。首先把問題規模縮小到非常容易解答的地步。
[題目]有足夠量的2分、5分、1分硬幣,請問湊齊1元錢有多少種方法?
此題乍看上去,只會覺得完全無法入手,但是按照由簡至繁的思路,我們可以先考慮極端簡單的情況,假如把問題規模縮小成:有足夠量的1分硬幣,請問湊齊1分錢有多少種方法?毫無疑問,答案是1。
得到這一答案之後,我們可以略微擴大問題的規模: 有足夠量的1分硬幣,湊齊2分錢有多少種方法?湊齊n分錢有多少種方法?答案仍然是1
接下來,我們可以從另一個角度來擴大問題,有足夠量的1分硬幣和2分硬幣,湊齊n分錢有多少種方法?這時我們手裡已經有了有足夠量的1分硬幣,湊齊任意多錢都只有1種方法,那麼只用1分錢湊齊n-2分錢,有1種方法,只用1分錢湊齊n-4分錢,有1種方法,只用1分錢湊齊n-6分錢,有1種方法......
而湊齊這些n-2、n-4、n-6這些錢數,各自補上2分錢,會產生一種新的湊齊n分錢的方法,這些方法的總數+1,就是用1分硬幣和2分硬幣,湊齊n分錢的方法數了。
在面試時,立刻採用這種思路是一種非常有益的嘗試,解決小規模問題可以讓你更加熟悉問題,並且慢慢發現問題的特性,最重要的是給你的面試官正面的信號——立即動手分析問題比皺眉冥思苦想看起來好得多。
對於此題而言,我們可以很快發現問題的規模有兩個維度:用a1-ak種硬幣和湊齊n分錢,所以我們可以記做P(k,n)。當我們發現遞歸公式 P(k,n) = P(k-1,n - ak) + P(k-1,n - 2*ak) + P(k-1,n - 3*ak) ... ... 時,這個問題已經是迎刃而解了
通常由簡至繁的思路,用來解決動態規劃問題是非常有效的,當積累了一定量簡單問題的解的時候,往往通向更高一層問題的答案已經擺在眼前了。
(二)一分為二
另一種思路,就是把問題一刀斬下,把問題分為兩半,變成兩個與原來問題同構的問題,能把問題一分為2,就能再一分為4,就能再一分為8,直到分成我們容易解決的問題。當嘗試這種思路時,其實只需要考慮兩個問題:1.一分為二以後,問題是否被簡化了? 2.根據一分為二的兩個問題的解,能否方便地得出整個問題的解?
[題目]將一個數組排序。
這個經典演算法肯定所有人都熟悉的不能再熟悉了,不過若是從頭開始思考這個問題,倒也不是所有人都能想出幾種經典的排序演算法之一的,這里僅僅是用來做例子說明一分為二的思路的應用。
最簡單的一分為二,就是將數組分成兩半,分別排序。對於兩個有序數組,我們有辦法將它合並成一個有序數組,所以這個一分為二的思路是可行的,同樣對於已經分成兩半的數組,我們還可以將這個數組分作兩半,直到我們分好的數組僅有1個元素,1個元素的數組天然就是有序的。不難看出,按這種思路我們得出的是經典數組排序演算法中的「歸並排序」。
還有另一種一分為二的思路,考慮到自然將數組分成兩半合並起來比較復雜,我們可以考慮將數組按照大於和小於某個元素分成兩半,這樣只要分別解決就可以直接連接成一個有序數組了,同樣這個問題也是能夠再次一分為二。按照這個思路,則可以得出經典數組排序演算法中的「快速排序」。
(三)化虛為實
這種思路針對的是浮點數有關的特殊問題,因為無論是窮舉還是二分,對於浮點數相關的計算問題(尤其是計算幾何)都難以啟效,所以化虛為實,指的是把有點"虛"的浮點數,用整數來替代。具體做法是,把題目中給出的一些浮點數(不限於浮點數,我們不關心其具體大小的整數也可以)排序,然後用浮點數的序號代替本身來思考問題,等到具體計算時再替換回來。
[題目]已知n個邊水平豎直的矩形(用四元組[x1,y1,x2,y2]表示),求它們的總共覆蓋面積。
因為坐標可能出現浮點數,所以此題看起來十分繁復(可以實踐上面由簡至繁和一分為二的思路都基本無效),略一思考,矩形的覆蓋關系其實只跟矩形坐標的大小有關,所以我們嘗試思考將矩形的所有x值排序,然後用序號代替具體豎直,y值亦然,於是我們得到所有矩形其實處於一個2nx2n的區塊當中,這樣我們用最簡單的窮舉辦法,可以計算出每一個1x1的格子是否被覆蓋住了。至此,只要我們計算面積的時候,把格子的真實長寬換算回來,就已經得到題目的答案了。
『貳』 燈塔問題,改用數組怎麼寫
給定一個數組,求和為定值的所有組合, 這道演算法題在leetcode應該算是中等偏下難度, 對三到五年工作經驗主要做業務開發的同學來說, 一般較難的也就是這種程度了.
簡述經過:
不算hr面,總計四面,第一天前三面, 然後過了一個多星期第四面(領導一般都比較忙~)平均每一面都是一小時,面完前三面已經很辛苦了. 我之前去美團面試從一面到hr面,總計四面 面了一下午將近四個小時...還不包括來迴路程,所以面試是項體力+腦力的活,准備的充分了,面試成功率高少跑幾次了~就會輕松不少~大部分同學面試面上幾家之後都懶得再跑了.言歸正傳,網路一面沒有怎麼問技術,主要問了工作內容,一面的面試官可能是負責日誌接收相關的工作,問了許多關於日誌打點,布碼,欄位格式,日誌測試校驗等方面的問題.在之前的工作中都涉及到了,面的不錯,而且面試官一點架子沒有,面試過程更像一個經驗溝通了.二面應該是個小leader,問了一些java開發必問的基礎題:比如: jvm,gc,手寫二分查找等.(以後有時間我會詳細整理下java基礎相關的東西)三面應該是個大leader,問的問題挺多的,不止是技術上的問題, 演算法題問了兩道,第一道想不起來了... 第二道是:給定一個數組,求和為定值的所有組合.下文解答. 對了,三面還問了spark相關的問題並且介紹了一下他們組的工作,包括離線數據計算,實時數據計算和數據挖掘等.三面都已經介紹自己組內的業務了,那肯定是過了,關鍵看四面了,四面是個經理,(經理思考問題的角度比咱們一般小兵要高~),主要聊了下業務上的東西,和一些遇到的不好解決的問題. 因為都是做數據開發並且都是媒體相關數據所以業務上的共同點還是比較多的,面試者思路較清晰,和經理聊得也不錯,最終如願拿到offer.
給定一個數組,求和為定值的所有組合--思路
這種題首先忽略掉效率最低的窮舉法. 給定一個數組arr,求和為定值SUM的所有組合,所有組合並不確定組合里元素的個數,所以可以考慮化繁為簡,一步步減少組合的元素個數.遞歸方式.例如,去掉第一個元素,求剩下元素中和為SUM-第一個元素的值的所有組合.剩下的元素中再去掉其中的第一個,求去掉第一個元素的值的所有組合.依次類推直到剩下元素中的和為0,則之前去掉的元素的組合即為滿足條件的一個組合.
『叄』 面試美團點評是怎樣的一種體驗
美團面試主要就是分為筆試和面試。
美團的筆試題目,演算法程序題居多,最後有安卓的、前端什麼的題。美團的題目還是不難的,特別看到幾道題目在lintcode上刷到過一模一樣的。
總得來說,前兩面沒什麼壓力,面試官基本是和顏悅色的,不會很嚴肅;但是闖到第三面的時候,你能明顯感覺到差別,面試官基本面無表情,要做好心理准備,面試過程中碰到什麼問題都不要消極處理,積極應對總有扭轉看法的一刻。
『肆』 美團外賣送餐員這份工作面試都需要面試哪些內容。
美團外賣送餐員工這份工作面試的話她很簡單的。嗯,其實相對其他來說,這個門檻真的不是很高,主要就是要一個健康證明,這個如果你的身體是健康的話,那基本上就沒有問題了啊,你去面試的話,主最主要的就是要提教你的這個健康報告,健康證明,如果有這個的話,其他一切都好說,因為其他的一些工作的注意事項的話,你應聘成功以後,美團外賣都會做一個相應的培訓,培養你作為一個職業的旗手,應該注意哪些
『伍』 美團前端面試難嗎
美團目前也是在大量的招人啊~~當時參加的是美團打車部門的面試(一年工作經驗以上的),部門技術棧vue,後台就是node,一面通過,等了兩個小時面試二面,然後通知我回去等消息,一般這樣就是掛掉了,毫無疑問。美團是一次性全部面完的。所以去參加最好做好面試四個小時的打算。
先來聊聊一面吧~哈哈
一面
1.簡單的自我介紹,與大體的了解我。。。
一面面試官非常不錯,先問了下幾個項目和用到的技術,會先對我懂的東西做一個大體的了解,比如webpack的單頁面的多頁面切換,webpack的按需載入,一些webpack的配置有哪些,問了有沒有看vue源碼,我說了一個vue的watch,大體問了問我框架方面的東西,發現我對框架並不是很熟練,安慰我說沒有關系。
2.promise的原理
這個面試官最讓人欣賞的就是不會去問你不了解的東西,一開問了我promise,發現我用的並不是很多,就很自然的說沒事,換一種方法問你~~~好和藹啊~
然後就讓我用原生js寫一個回調函數,其實就是問promise的原理了,js寫一個。
3.this指向
這個是面試官手寫了一道變態長以及繞的this指向題,可以自行網路js this指向面試題,看幾道沒有啥問題,需要關注的是其中也考了,argument,和apply(null)。以後想起來再寫吧
4.bind與函數柯里化
也就是寫個bind,這個紅皮書高級函數(22章)有,
可以看下。不過還是得先理解bind的用法,返回一個函數,以及可以傳遞的參數。參數這里涉及到了函數柯里化。都是手寫代碼,而且最好寫的整潔,因為我有些一筆帶過,面試官都讓我寫完整,明確說要看我寫代碼水平
5.==, isNaN, typeof
問這個之前先問了我有幾種數據類型(七種,下圖再加symbol),這里隱形的看你知不知道es6,symbol這個新出的類型。說出了symbol自然會問你這個類型有什麼用。
然後就寫了好多個typeof,isNaN,==的問輸出,這個就是基礎題
6.知道什麼http請求頭?
這個可以說的很多,說了幾個,又主動說了下有關跨域請求頭,之前項目用的cors,於是和他聊了一會,其實面試就是主動表現自己,把自己知道的都說出來,不然幾個請求頭說細不細,要問細了能把人問蒙了,最好把話題引到自己知道的地方。
7.問了css
問了css盒子並畫出來,清除浮動與bfc,兩列布局。
8.說了一大堆其實就是想考我防抖
面試完這個問我想問的問題,我直接問還有二面么?回答有的,又介紹了一會美團打車,說是後台是node,看來要求是前端也要有後台的知識嘍。
二面
二面的是我的學長,可是我被問慘了。。。。問的顯然比一面深入很多,都問了java
1.自我介紹,問項目
針對項目問了不少,當時有一個支付行為的項目,於是問了很多安全方面的問題,蒙蒙的,完全不知道。第一個就很失敗了。然後問了其他的項目,問了websocket。
2.node的EventEmitter用js實現出來
寫出來了,但是可以看出來代碼寫的不規范,學長面試官表示看起來很亂。不過大約算是可以的,指出了幾個問題,讓我進行修改。(之後完善)
3.虛擬dom
其實vue中就有jsx,react的特點之一有jsx,虛擬dom和代碼優化有點關系。
先說下正常對dom的操作,在瀏覽器中分為渲染引擎和js引擎,現在瀏覽器內核一般都是渲染引擎(生成渲染樹),因為js引擎越來越獨立了(所謂的v8引擎?)
然而你在js中獲取dom元素的時候你必須要通過渲染引擎,這樣兩個線程之間的數據交換自然會很慢。所以在前端優化中總是要考慮減少dom操作這一項。包括獲取dom元素變數儲存起來。
jsx是把dom元素變成了儲存在內存中的數據結構。js很快,操作dom也很快。不過也存在缺點,目前的理解就這么點了。
4.路由的實現原理
餓,不知道。。(待會看!)
5.node文件流,java的映射機制(記不太清楚)?
餓。。
6.數組方法map和recer區別?
餓
7.進程與線程的區別
終於有個我會的了,這個顯然想問你js的運行機制。先介紹了下進程與線程。
一個瀏覽器是一個進程,雖然js是單線程的,但是瀏覽器是多線程的,v8引擎也是多線程的,比如有渲染線程,有處理請求的線程。然後說說任務隊列,eventloop。沒有理解很深也不敢往下說。
事件循環可以看下這個,鏈接
8.樹遍歷
先序,中序,後序。我只知道這么多了,顯然想讓我寫一個的,可是不會。也顯然面試官內心已經把我pass掉了,沒多問。
9.問了個演算法
KMP??反正我不知道。
『陸』 大公司筆試面試有哪些經典演算法題目
1、二維數組中的查找
具體例題:如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為迴文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是迴文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是迴文序列。現在給出一個數字序列,允許使用一種轉換操作:選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。現在對於所給序列要求出最少需要多少次操作可以將其變成迴文序列?
『柒』 美團外賣工作都面試哪些內容啊
這種工作我勸你還是不要去的好,一個意外保險,美團把外賣包出去了,你即使出事也找不著人家,但是人家可以罰你錢, 各種黑幕,真心的,掙得多少心裡不得勁也沒用,一個月全勤獎50塊錢,我過這么大第一次聽說。 各種獎勵還是罰員工,一到月末就各種罰,罰完給你獎勵。 反正就是拿錢說話,真正拿自己手裡沒多少錢,受商家的氣,組長的氣,副站長,站長的氣。個人親生經歷,已經失望了。
『捌』 美團數據分析筆試考演算法嗎
考。
線程,block塊,KVO,界面傳值等還有一些基礎的OC語法的知識,可是都點悲觀,就考到了一點關於3種線程的知識。
因此說知識要全面整合,才能達到作題穩而准,平時不注重基礎,單純寫一些技術的東西,不注重基礎是不能夠的。
『玖』 請問面試美團的正常流程是什麼
美團面試主要是分為筆試和面試,美團是分批面的,基本是一次性面完總共三面,全都是技術面的。一面沒通過,直接說farewell了。前兩面沒壓力,面試官是和顏悅色;到第三面,能明顯感覺到差別,基本面無表情,做好心理准備。面試過程:筆試題目,演算法程序題多,最後安卓前端題,題目還是不難的,題目在lintcode上刷到過一樣的。第一面:隨時Be Nice,一個普通員工就可能是你的面試官;首先做自我介紹。面試官對我的經歷問了幾個問題,然後就是問些很基礎,進程和線程的區別;進程間同步方式,。還問到如何編程實現 a^n ,我就說用二分的思想。說到思想,美團蠻注重思想的,第二第三面過程里如果有什麼你一下子難實現的,你就講清楚你是怎麼個思路,不要消極對待就好。然後就是隨意提問,問到了Java裡面的各種語言機制,問到了計算機網路裡面的三次四次握手,UDP和TCP區別,get和post區別等等,沒有深問。問的很雜很多。
第二面:基本上是沒問操作系統和網路的題目,就出演算法題,有如何判斷一個二叉樹是另一棵二叉樹的子樹;像列印機一樣,倒過來列印一棵樹,比如一個樹是這樣的,輸出4、5、6、2、3、1,這個就用層次遍歷,存儲遍歷過的節點,在每一層的結尾存儲該層的個數……面試官檢查驗證代碼超級仔細,所以面試過程中做題目的時候還是要更加專心一點,不然被他發現錯誤. 接著,第二個問題,自己寫一個Stack類,要實現push、pop操作。
第三面:面試官基本是Boss級別的吧,各種問題啊,興趣愛好未來規劃啥,了解你這個人的性格和美團契合。三面都是技術面,最後還是要寫代碼
1)實現 char* upcase(const char* src, int len)。
2) 類似6,7,8,1,2,3,4,5 的序列中用二分查找某個數。他還會問問看過的書啊,問幾個簡單的問題,能答上來就好。基本是工作要求里提到的名著或者就是教材里學到的東西,因為三面的面試官是大佬,是希望能我們能有積極解決問題熱情。
前期准備:對美團注重演算法早有耳聞,還是很早就開始准備刷題。面試時筆試和面試里都遇到了在lintcode 做過的原題。總之,面美團演算法必要刷,難以實現就用邏輯清晰的思路來拯救面試;在技術都OK前提下,面試官看重的更多是優秀邏輯思維能力,善於從復雜系統表象中分析問題,對解決復雜問題充滿激情。不要遇到困難有消極情緒!
『拾』 美團面試問問題!
首先根據你的情況初試完了之後都會存在這一過程,面試是雙向原則,面試官一般都會看你的全方位,比如表達,思維能力,舉手投足,應變能力,穿著打扮等等雙方都會進行一個評估
其次一般的通知時間不會超過3天,兩天之後沒有答復面試成功的可能性就大大降低。按照你的情況可能公司也會有一定的面試期安排,所以你可以先等通知,順便也可以找其他工作,
最後如果你實在特別想這份工作在兩天後還沒給你反饋的情況下,謙虛的主動打電話詢問面試情況,了解面試具體評判結果,對你以後面試也是有幫助的,公司有時對於主動的人也會區別對待
祝你好運