美團前端面試小結,美團面試小結
美團是我自學前端以來第一次去現場的面試,在網上搜了一下以往的面經,普遍反映說美團面試超級高效,都是技術面,這次去真的是體驗到了。一共面了三輪,每輪都差不多一個小時,都要寫代碼。
一面主要是考察對CSS、JavaScript基本知識的掌握,資料結構演算法也會問。總之就是對考察基本功啦。
二面就沒那麼細了,稍微宏觀一點,有一種考察你對前端有沒有sense的感覺,比如在怎麼實現一個模組,有哪些方法、注意事項啥的,當然也會寫代碼。
三面應該是Boss層級的吧,各種問題啊,興趣愛好未來規劃啥的,感覺有點像瞭解你這個人的性格和美團契合不了。前面說了都是技術面嘛,最後還是要寫代碼的。
由於自己才學兩個月,心裡超級沒底啊,很緊張的說。住同學那兒離得遠,買了袋奧利奧心想那邊有沒有快餐啥的到了再去吃午飯,事實證明我想多了,導致每輪面到後面我都感覺到胃在收縮啊,無法思考啊媽蛋,然後面完休息的10來分鐘狂吃奧利奧,,,好囧,,,以後一定要吸取教訓,吃得飽飽的去。
噢噢,雖然最後還是沒有通過面試,但是美團絕對是我目前所有面試中收穫最多的一次,覺得很有必要記錄一下。噹噹當,乾貨來了:
一面
一面是個和我年紀差不多的萌萌噠小哥,啊哈哈,一看到他那麼年輕,瞬間有種同齡人的親切感,沒那麼緊張了。
不過小哥雖然看起來稚嫩,也是絕不廢話,乾淨利索地在紙上記錄他提的問題還有我的回答,不一會兒就記了好多。一面就主要是考察前端的基礎還有演算法。。。(小哥問我演算法和資料結構瞭解得怎麼樣,我好心虛,說只瞭解基本的排序啥的)。
好了開說問題:
1.一個浮動的div後面又跟了一個div,在頁面上是怎麼布局的:
分別討論了這幾種情況:
(1)前一個div有寬度和高度,後一個div有高度寬度沒有設定。
我勒個去一開始答錯了,說沒有個寬度那應該是條豎線吧,小哥笑了笑說display你有瞭解麼,說了一通,他問display:block是啥意思,又blalala,小哥說那塊元素是啥,我說會佔滿整行,小哥就說那為啥那個會是豎線呢。好丟人啊。。。這麼基礎的。
(2)後面一個div中間有很多文字,會怎麼顯示。
(3)下面的圖怎麼實現:
2.怎麼實現焦點輪播圖
除了給序號綁定事件之前用屬性記錄外,還能用什麼。。。閉包的理解差到爆啊。
3.綁定事件都有哪些方法,你為什麼要用onclick這種方式
4. 事件捕獲的應用情境,那事件冒泡有用過嗎,什麼時候需要用到事件冒泡。然後出了一道題:
<\ul id=’list’>
<\li><\li> ….有n多個
<\ul>
要實現點擊一個li就能顯示它內部文本。
我寫了個最普通的在li上綁定事件,小哥說那要是li是動態增長的呢。你擷取li集合是之前的了,我說那用事件冒泡,給ul綁定點擊事件,事件處理常式中再重新擷取它下面的li,動態給每個li 綁定事件,小哥說那你的這個ul只是給li綁定了事件,但是這次就不能觸發li上的事件了呀,然後又討論到怎麼知道點擊到哪個li,小哥說可以用event對象,它應該是有個屬性吧,,,但是不知道。。。
查了一下可以用event對象的屬性target或者是srcElement,他們都指向最具體的那個目標元素:
var list=document.getElementById("list"); list.onclick=function(ev){ var oEvent=ev||event; var target=oEvent.target||oEvent.srcElement; alert(target.innerHTML); }
事件會冒泡到ul上,ul上綁定了onclick事件,事件處理常式中是輸出具體目標元素的innerHTML內容。這樣,即便時li數目動態增長了,也不會出現之前所說的問題。
5.寫了個歸併排序。期間還把數組給寫錯了,new Array(),小哥說這個在java中是介面,不能new。
6.分析各種排序演算法的複雜度,最優和最差。快速排序的複雜度為毛是O(nlogn)。
應該還有問別的問題,有點想不起了。。。然後小哥收拾桌上的紙說你在這兒等一下,我就眼前一亮,啊哈原來一面過了呀,前面有好幾個寫代碼的都寫得不好,很多錯,小哥一直在引導我思考,哪兒錯了,該怎麼改。最後小哥還跟我說廁所該怎麼走,太貼心了呀,小哥好人一生平安。
二面
二面的面試官有程式員的某種典型形象哈哈,自行腦補。他好像有點忙的樣子,我在想題的過程中他就在看手機,,到後面又說了好幾次上一輪面試的時間沒太控制好balalala,小哥回去不會挨批吧。。。不太考基礎了,考了對前端的認識,還有一些功能上的整體設計這種。
1.為啥要做前端,前端喜歡那些方面,我說了互動、介面啥的,他就立馬問你見過哪些互動做得好的,哪些網站的介面做得漂亮,我說了禪意花園,他說你有看那本書嗎,為什麼不看,然後又說他們有個網站上面有很多作品你可以去看看。
2.給一個輸入框,下面要動態給出提示詞,怎麼實現,大概分幾個板塊。我用了keyup事件。面試官又說如果使用者輸入v,vi,v,vivi,via。。。應該什麼時候擷取輸入框中的文本發送給伺服器不會發送太多請求。我說了個延遲多久才發送,好像不太合理的樣子。。。。他又說怎麼實現輸入拼音或首寫字母提示框中能出現可能的漢字。。這個真不知道,面試官說有個拼音庫的東西。。。
3.使用者註冊表單,作為前端你應該做怎樣的設計,應該考慮什麼防範因素:
我說了惡意代碼,他說這個資料庫那邊會考慮;
我又說應該考慮什麼時候把使用者輸入的資料非同步發送過去驗證;
他問我如果返回了使用者名稱已被註冊,怎麼防止別人破解出密碼(暴力破解)。我沒答出來,面試官說限制輸入次數,,驗證碼啥的。。。
4.編程題:
一個int類型的資料只能儲存16位的正整數,即範圍是10^16-1.問怎麼求任意大的數的階乘。編程。
我說轉成字串拆分,他說思路對的。後面的運演算法則那塊兒就想不下去了。面試官又降低了難度,說只允許個位元相乘,那怎麼求解兩位元相乘。。。艾瑪當時好餓呀,覺得已經無法思考了,面試官說你現在可能已經暈了,回去再想吧,囧。。。
表示第二輪面試應該要有挺多開發經驗才能答,對於我這種小白真心是招架不住。面試官還問我你在這兒實習了準備怎麼學前端,怎麼和其他人競爭留下來,啊啊啊啊,好憂桑,覺得自己那麼菜,我還是說了點自己準備怎麼學。他又問我有什麼優點,技術類非技術的都可以說。
三面
答得不好都能進三面我還是很意外的,也很開心呀。心想三面應該是走過場吧,後來證明我想錯了。美團三輪都是技術~~~三面應該是部門主管那種boss層級的level吧,果然面試官氣場很強啊,有種霸道總裁的犀利和嚴肅哈哈,雖然穿了個程式員標配→_→大褲衩但是絲毫沒有削弱那種氣場,一遇到氣場強的人我就慫,面試過程中真的是一直很慫~
1.怎麼自學前端的,都有哪些方式,我說了知乎、csdn,他問我知乎帳號是啥,我一直是瀏覽器記住密碼或者用郵箱登陸的,真的不太記得了。。。不會以為我在撒謊吧。
2.關注哪些技術人、非技術人(崇拜的人)
3.影響最深的三本書非技術類、技術類
4.有想過進其他傳統行業嗎
5.職業規劃五年,有想做產品經理嗎
6.考慮的工作地點
7.為毛沒實習過。。。囧。。。我能說以前沒開竅,很不喜歡寫代碼,不想做程式員麼。
8.為什麼不找人內推。。。
9.為啥不想做研究,導師有推薦工作嗎,有考慮做移動端的開發嗎,安卓,ios。。。
10.問了我前端哪塊兒比較熟,可以選方向闖關。。。艾瑪,我說JavaScript。
他問那==和===有啥區別,那[]===[]和[]==[]會返回什麼。他說你先別急著說答案,可以自己先分析。我就說等號兩頭的[]是兩個不同的對象,應該會返回false,他反問了你覺得是false?瞬間搞的我沒底,又想了下,回來後自己查的確是返回false的,這是壓力面麼,,還是怪自己掌握得不透徹。
11.primitive value都有哪些類型,我說有null,他呵呵了,我又說null是Null 物件,那應該是參考型別吧,他沒肯定,說typeof null返回的是object,但是應該在不久的將來規定會返回null。我記得我看的書上說null是primitive的呀。。。
12.然後這都回答不出來,他就不問JavaScript了,說出道編程題你給做,用什麼語言都行:
一個老師一學期的課表,用數字來表示這個周有沒有課,有課的周記為1,沒課的周為0。然後給定一個數字,可能是十進位的,要輸出老師的哪些周有課,哪些沒課。比如:11100101輸出形式按以下方式:
1~3:”yes”,2~4:”no”,5:”yes”,6:”no”,7:”yes”
我說了下思路,他問了toStirng()裡面的參數都可以是哪些,40可以嗎,為什麼不可以。下面是我寫得代碼,不知道有沒有更簡單的方法:
function schedule(num){ var scheStr=num.toString(2); //'11100101001' console.log(scheStr); var flag={ value:'', count:0 }; for(var i=0;i<scheStr.length;i++){ if(flag.value=="" || (scheStr[i]==flag.value)){ //某個字元和前一個相同 flag.value=scheStr[i]; flag.count=1+flag.count; }else if(scheStr[i]!=flag.value){ //和前一個不同,輸出之前的並將當前字元的值存入value,更改count值 showResult(i,flag.value,flag.count); flag.count=1; flag.value=scheStr[i]; } //i進行到最後一個字元沒有下一個字元來觸發,應該輸出最後的結果 if(i==scheStr.length-1){ showResult(i,flag.value,flag.count); } } } function showResult(index,value,count){ if(value=='1'){ count>1?console.log((index-count+1)+'~'+index+': yes') : console.log(index+':yes'); }else if(value=='0'){ count>1?console.log((index-count+1)+'~'+index+': no') : console.log(index+':no'); } }
12.面到上面一道題都5點多了,他又我出了道怎麼把一個矩陣按斜線的方向打出來,讓做完後發給他好後續安排:
1 2 3 4 5 6 7 8 9 10 11 12
即 4 3 8 2 7 12 1 6 11 5 10 9.
木有思路呀,,網上查了下,改了個代碼:
function printMatrixBySlash(arr){ var rows=arr.length; var cols=arr[0].length; var Min=Math.min(rows,cols); //限制了斜線中元素個數增長的上限 var lines=rows+cols-1;//斜線數目 var len=0,r=0,c=0; //求每條斜線的起始座標、長度即可 for(var i=0;i<lines;i++){ len=Math.min(Math.min(i+1,Min),rows+cols-1-i); r=Math.max(0,i-(cols-1)); c=Math.max(0,cols-i-1); var res=[]; for(var j=0;j<len;j++){ res[j]=arr[r+j][c+j]; } var p=document.createElement("p"); p.innerHTML=res.join(" "); result.appendChild(p); } } //測試 var arr=[[1,2,3,23], [4,5,6,56], [7,8,9,13] ]; var orgMatrix=document.getElementById("orgMatrix"); var para=document.createElement("p"); for(var i=0;i<arr.length;i++){ para.innerHTML=para.innerHTML+arr[i].join(" ")+"</br>"; } orgMatrix.appendChild(para); var result=document.getElementById("result"); printMatrixBySlash(arr);
藍後我就坐公交回同學那兒了,兩個多小時,又累有餓,腿都快斷了。
後記:題發了好幾天還是沒有回應,我就在知乎上提問說美團面試一般多久給結果,後來很快就收到郵件,就是最後一個面試官發來的!說在知乎上看到我的提問了,特地來回複我,,,木有被錄取,但是會幫我問其他部門招不招,,雖然希望不大,但還是很感謝他。
不得不再說一次,這次美團面試真的是收穫很大,美團優秀的面試官和他們高效的面試過程給我的印象很深刻。再總結一下吧:
1.相對於直接給出答案,面試官更看重你的分析過程,所以盡量要給人家說清楚你的思考過程,即便不能得到最後答案,也要讓別人看到你是會思考的。
2.對於回答錯誤的題,在面試官的引導下(好的面試官是會引導你思考的),你要發現並解決問題,這樣人家會覺得你具有可塑性,具有解決問題的能力,即便是目前所掌握的技術還不好
3.要對自己的學習過程有充分的理解,多種途徑學習,通過問你的怎麼自學前端的可以考察你的學習能力
4.對職業有明確的規劃,才能走得更遠,對企業來說他們也會認為你有穩定性
5.既然要做技術,視野就要開闊,多瀏覽部落格、論壇啥的,關注一些牛人
經過美團的面試,不再怕當面寫程式了,以前對這個超級恐懼的,現在覺得即便是你從來沒有見過的題目,經過思考也是會有思路的,再次感謝面試官的引導呀~~~~好啦,這篇面試小結就寫到這兒吧,繼續努力,希望以後有實力進優秀的大公司。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。