【面經】美團-前端&移動端暑期實習

ZzTzZ發表於2024-03-20

不知道為什麼,按照群裡的要求說,25屆畢業的都需要投【轉正實習】,而不是【日常實習】

機試

機試在牛客,整體上按照基礎+演算法的層次劃分。

計算機基礎關於作業系統,讀取硬碟和扇區的部分不太記得了。總之基礎不太牢固,預估選擇題總共30個錯了5-10個

當時想法就是隨便做做,也沒提前準備太多,所以也沒太記住都考什麼了

關於機試演算法,或許是按照前面的答題情況來分配的?我不知道總之兩道題都很水,微信公眾號也能看到機試的全部演算法題目。

面試

面試才是促使我寫這篇Blog的核心,剛剛完事,心裡百味雜陳就寫了。

【組成】:個人介紹+計算機基礎(偏向計網)+語言核心(選擇java)+方向核心(選擇安卓)+演算法題

計算機基礎

  1. 計算機網路相關,你都知道那些http狀態碼呢?

答了200,301,302,500,404這些。

  1. 剛剛你提到300系列開頭的都是關於重定向的,能詳細給我講講嗎?比如301和302的區別?

當時就沒太答上,大概我說的是‘301是Moved Permanently,是永久移動,302是臨時重定向’
【參考答案】:301是永久重定向,表示所需求的資源已經永久的轉移到了新位置,這包含了域名的改變和資源路徑的改變。
302是臨時重定向,表示所請求的資源在24到48小時內臨時的轉移。

  1. 那臨時重定向和永久重定向有什麼區別?能詳細說說麼

完全沒答上,說了個URL會改變,其實完全不對,他們的區別是URI的關係,但彼時的我根本不知道什麼是URI
【參考答案】:為什麼要重定向呢?因為網站的URL經常會被使用者收藏在自己的收藏夾,或者透過許多渠道進行傳播,而如果使用者再次透過URL訪問這些資源時,如果不重定向那麼就會404。而如果重定向後,瀏覽器會根據伺服器的反饋得知資源位置改變了,之後就會訪問新的資源位置。
而關於臨時重定向和永久重定向的區別,302的重定向是臨時的,所以瀏覽器的快取不會變,依然是源路徑,在重定向結束可以方便的恢復原狀。391

  1. 那麼什麼時候會使用重定向操作呢?

答上了“更換域名”
參考答案:域名更換,多個域名跳轉(主要是為了多個域名引流到主站),網站的調整(改變了目錄結構),路徑的改變(網頁被遷移到了新地址),網頁擴充名改變(php快取html)
只有這幾種情況在源路徑或域名存在時可能用302

【擴充】302的風險:

  • URL劫持
    有的時候A網址很短,而B網址可能URL很亂。A網址由於更加使用者友好,某些搜尋引擎比如Google會仍然顯示網址A。但是排名演算法名不能分清A和B之間的索引關係,所以可能有人做一個簡單明瞭的A重定向到複雜的網址B。這樣製作了A的這個不道德的人就可以賺取排名演算法的熱度,但是內容確是別人生產的B。
  • 網站降權
    由於搜尋引擎會認為302跳轉是用來干擾結果的非法引用,所以會降權懲罰。
  1. 關於http協議和tcp協議,能解釋一下他們的關係和區別嗎?

我的回答:首先他們是網路不同層次的協議,tcp協議屬於傳輸層協議,面向了資料的傳輸。http協議是一個應用層協議,規定了傳輸的內容的格式。http協議的資料是基於tcp協議進行傳輸的。
【補充回答】:其實整體上已經回答的很全面了,但是有一個很關鍵的點沒說出來,因為HTTP協議是一種在資料傳輸之前建立連線(三次握手),在資料傳輸結束之後就斷開連線的(四次揮手)。但http協議通常是無狀態的,每次請求和相應之後不保留任何的連線狀態。

  1. 講一下http這麼多版本比如http1.0和http2.0的區別和聯絡

我的回答基本全錯,純在胡扯。【反思】:以後不懂一定要先說明白,不能不懂裝懂,很掉分。
【參考回答】:here
http一直在升級最佳化

  • http0.9
    0.9協議是一個交換資訊的無序協議,只用於交換文字。沒辦法顯示圖片等資訊。
  • http1.0
    1.0協議是最重要的面向事務的應用層協議,協議對每一次請求和相應都建立並且拆除一次連線。
    http1.0規定了瀏覽器與伺服器保持短連結。瀏覽器與伺服器的每次請求都需要建立一個TCP連結。在伺服器處理完請求之後立刻斷開tcp連結。伺服器也不跟蹤使用者過去的請求。
  • http1.1
    http1.1支援使用長連線,並且預設使用,同一個tcp連線中可以傳輸多個http請求和響應。減少了“由於多次建立和關閉連線導致的效能消耗和時延”
    http1.1新增了多個狀態響應碼。
    http1.0認為每臺伺服器都繫結唯一的IP地址,所以請求訊息的URL中並沒有傳遞主機名,但是隨著虛擬機器技術的發展,一臺伺服器上的多臺虛擬主機共享同一個ip地址。http1.1的請求和相應都支援Host,如果沒有Host的話會報一個400的錯誤。
  • http2.0
    http2.0包含了新的傳輸格式,本身的1.1是使用文字格式的,而2.0是使用二進位制格式的。
    http1.1有一個致命的阻塞的問題,因為沒有使用“多路複用”,那麼如果達到了最大併發處理量,或者由於序列的檔案傳輸,都會造成多餘的等待時間。
    而在http2.0中加入了資料幀和流的概念,也就是把一個訊息切片,並且最終瀏覽器按照順序進行合併。(有了這個優勢,就可以解決序列的檔案傳輸問題了)
    而基於流的http2.0,不管訪問同一域名的多少檔案,都是一路連線的。大大提高了併發量。
    http2.0的header基於encoder技術被壓縮。

【知識補充】URL和URI的關聯。
參考回答:here
一看就懂,就不總結摘抄了

  1. 關於header的驗證,講講你知道的cookie,token,和session。

其實這個本來問的很多很雜,從服務端到客戶端,從web到android都提問了,簡單做個總結吧。
【參考回答】:https://zhuanlan.zhihu.com/p/631349844
首先三者的作用都是進行身份驗證。而cookie和session是搭配使用的。cookie和session二者分別對應在客戶端和服務端,透過sessionId建立起聯絡。
而cookie首先需要解決跨域攜帶的問題,會遭受CSRF攻擊,在客戶端儲存有資訊洩露風險。token不存在這個問題,token裡面只包含了使用者id,不怕被擷取。接下來token既可以儲存在客戶端又可以儲存在服務端,但是效率比較低,因為只有id,一切操作都需要服務端對資料庫進行操作。session由於包含了完整的客戶資訊,這方面的效率就很高,但是由於每個客戶端都需要查詢,還需要建立session,所以會佔用伺服器資源。而session單獨儲存在伺服器相對安全。

語言核心

  1. 講一下java的hashmap,hashcode,hashtable。

沒什麼好說的,基礎題。但是其實關於冪次擴充套件,0.75閾值的知識點還需要詳細看一遍。紅黑樹的實現和複雜度也要再看看。

  1. 剛剛提到hashmap可能會存線上程安全問題

基礎題,從hashmap過渡到多執行緒從而考作業系統也是常規操作。

  1. 那為什麼cocurrentHashmap可以保障執行緒安全?
  2. 講一下java的IO流

沒學過這方面的,只答上了Reader和Writer兩種流。
【參考回答】:https://blog.csdn.net/qq_44715943/article/details/116501936

  • 按照流的方向進行分類分為 Input/Read,Output/Write。(方向相對於記憶體來說
  • 按照流的型別進行分類:位元組流/字元流
    位元組流:java.io.InputStream , java.io.OutputStream。位元組流是萬能的,什麼型別的檔案都可以讀取,無論是圖片,影片,聲音等,一次讀取一個byte。
    字元流:java.io.Reader , java.io.Writer 一次讀入一個字元,主要是為了方便文字形式的讀入而設計的。注意凡是能用記事本開啟,能正常顯示內容的,都可以用字元流讀入。

無論是任何型別的流,都實現了Closeable介面,都實現了Flushable介面,也就是說都有close()方法和flush()方法

  1. 關於final關鍵字

感覺答得挺全面的,不知道為什麼好像面試官沒什麼反饋
作用域:對變數,方法,類都可以宣告
final變數:final變數經常和static一起使用,當作常量。final變數是隻讀的,必須初始化。
final方法:final修飾的方法不可以被子類方法重寫。final的方法比非final方法快。
final類:final類不能被繼承。

  1. final類可能是抽象的嗎?

我當時確實有點不確定,想了一下既然不能被繼承,而抽象方法必須有實現。所以不可能。(兩個關鍵字就直接是反相關的,final類不可能是抽象的)

  1. 抽象類和介面
  2. 關於java多繼承
  3. 如果想實現類似多繼承怎麼辦?
  4. 為什麼dart可以多繼承?

上面幾個問題比較水,答得反饋也整體不錯,不做單獨答案整理。關於dart的混入和多繼承可以看我以前部落格(恰飯

方向核心

這裡非常痛苦,因為會flutter,但是關於安卓的元件,狀態,事件,生命週期都瞭解甚少。
看來不得不啟用kotlin面經了(bushi

【tips】可以從小的flutter專案爆改安卓原生開始做起。從ui到功能,慢慢遞進

演算法題

  1. 一個矩陣,翻轉90度輸出。
    輸入的話比較麻煩,類似於python的二維列表。我是c++寫的,按照字串直接讀進來模擬指標處理的。
    話說如果真的要進行翻轉,而不是投機取巧換遍歷順序的輸出,那麼可以1.直接複製一個矩陣空間處理/2.直接先沿左上-右下對角線翻轉+每一行翻轉/3.類似弦圖,沿著半徑方向挨個翻轉
    法1空間O(n^2),法2空間O(1),法3空間O(n)
    時間複雜度都是O(n^2)

  2. 模擬,給一個由數字串,按照漢語口語描述習慣輸出。
    四個字元為一個小塊。兩個塊之間用億/萬進行連線即可。小塊內部間隙挨個輸出千/百/十即可。
    寫了20多分鐘,都在踩和填下面的坑:
    需要注意:
    1.在數字中間有多個零時,通常只讀一個,比如1005
    2. 類似400這樣,以零結尾的,通常不讀。(此條可以與上條一起合併)
    3. 但是連續的0有特殊情況,比如 100005,也就是說“萬”和“億”這樣模組之間的連線詞要輸出。
    4. 注意在1在首部的時候有不讀的情況比如:180000讀作十八萬,而1800讀作一千八。(這裡我指出後,顯然hr也沒想到,後面就讓我不考慮了)

相關文章