你可能需要這份大廠面經

今年小紅書這邊發完年終獎之后,心里隱隱覺得要出去看看機會,因為在小紅書這邊已經呆了快三年了,對于一些技術,業務總覺得有點麻木了,內心里總覺得自己啥都會了,但是很多只是知道個皮毛。

有句話是這么說的,一個人在一個地方待久了,內心里以為他所處的這個環境就是全世界,所以想著做些改變,不管結果如何,至少讓自己走出舒適區,同時也想著能去大廠看看。

其實大家也不能特別迷信大廠,認為加入大廠就沒有后顧之憂了,只能說目前對我現在這個階段來說,加入大廠刷一下自己的大廠背景這個對于自己當下來說還是有益的。

一開始也是不確定到底要不要出去看機會,一個是因為疫情,另一個是內心里總覺得沒有準備好,其實很多事情在你開始行動的時候就沒有那么多顧慮了,就像很多人在學生時代考試時一樣,永遠都會覺得自己沒有復習好,但勇敢地邁出第一步,后面基本就沒啥可恐懼的了。

自己這段時間主要就面試了三家公司吧,字節,騰訊和阿里,但經歷的面試場次感覺有十來場了,有的對應的是同一公司的不同業務吧,字節面的兩個業務部門都失敗了,騰訊那邊QQ音樂團隊給了Offer,阿里這邊也給了Offer,說實話,面試還是蠻累的,于是后面其他的公司也沒有再嘗試了。

字節

最開始面試的是字節在上海這邊的在線教育部門,這算是自己今年的第一次面試吧。

由于當時是處于一個基本沒有啥準備的狀態下面試的,最早是由于之前同事海哥幫忙內推的,我一開始的時候也是有點沒想好是不是要面試,但因為海哥說了幾次,索性我就面面看看吧,因為自己這個時間點基本是沒有怎么準備,所以面試答的不怎么好,另外就是字節對于算法比較看重,我當時算法題沒些出來,所以這一面基本就沒有后續了。

這次主要問了以下幾個問題,都是我面試完通過記憶記錄下來的。

首先是自我介紹吧,介紹之前的一些經歷和項目

  • 做過哪些app的性能優化
  • 使用什么工具進行內存分析
  • 講講事件攔截機制
  • 對于網絡的理解,http和https的區別
  • 講講對于UI的理解
  • 安全,怎么保證安全,除了網絡層的安全,app其他地方如何保證安全
  • App為什么要簽名
  • 算法題,最大區間問題 已知一天內用戶登錄登出的日志(數據量較大),求這一天用戶在線的最大峰值和持續時間段 日志包含字段(userid, login_time, logout_time) 登錄登出時間精確到秒
    從這次我也還是懶懶散散地在準備中,可能面試失敗對我并沒有產生多太多觸動。

這次面試沒有后續之后,后來字節這邊有個安全的團隊也說是要和我聊聊,這次面試的時間是在周六,當時一共進行了兩場面試,為什么是安全團隊呢,因為他們看我的簡歷發現我是信息安全畢業的,但是說句實話,學校里學的那些關于信息安全相關的知識離工程實踐還是有點遠的,所以這次面試我基本上都是全程懵逼狀態。

下面列舉的是這次面試的一些問題:

  • bindService的流程
  • 應用雙開的機制
  • 第三方的權限攔截
  • 自我hook
  • gps的定位模擬
  • imei號的偽造
  • socket通信 JNI 輸入
  • WebView的讀文件flag在4.4是否開啟
  • Android中的網絡通信方式有哪些
  • IPC的方式
  • 廣播實現IPC方式的話有什么安全隱患,需要注意什么

字節這邊后面還面過抖音的上海部門,這會已經是后面了,因為這時基本已經拿到騰訊的Offer了,阿里這邊也還在面試流程中,所以就想著面面看看情況,這次是一個之前的同事的同事幫忙內推的,這里同樣列舉下問的問題:

  • 問了我簡歷中做的那個吸頂效果,怎么實現的
  • 對象的創建的流程
  • 事件分發的流程
  • OOM發生在哪些區域
  • 方法區加載的類是否會被GC
  • startActivity的流程
  • 開機啟動的流程
  • RN的工作原理
  • fluter了解嘛
  • RN有些時候為什么有留白
  • 包體積優化
  • Android的系統架構
  • 小紅書首頁過渡嚴重,過度繪制的解決
  • 優化做過哪些,數據是怎么樣的
  • 小紅書筆詳的引導是怎么做的
  • Android為什么有多進程,單進程都沒有多進程通信的問題了,不挺好的嘛
  • 雙指按下去一個View不抬起將View滑出屏幕這個流程是怎么樣的
  • yogo是干什么的
  • litho的原理是什么
  • 指定start和end位置的鏈表的翻轉

相對來說,我覺得抖音的這次面試有些問題問的還是比較有難度的,加上我后面給了個算法題也還是沒能寫出來。所以基本上后續也沒有消息了,唉,感覺自己還是太菜了。字節每一輪面試都會問一個算法,對于算法的考察應該算是大廠里面比較嚴格的。

騰訊

后面有個獵頭說是微信那邊要招人,說是機會不錯,于是我決定試試。當時想著就當增加增加面試經歷吧。

后面獵頭推薦后,廣州那邊有個人打電話過來說是要進行電話面試。我當時其實關于算法這一塊還是沒怎么復習,于是這次微信的面試直接上來就是筆試,我記得是5道算法題,還有一個關于多線程的編程問題,要求45分鐘內完成。

大概的題目如下:

題目1(算法):給出n(n>=1),請把1,2,...,n,最小分成m組,使得每組內的數字都互質,求m值。例如n=7,可最小劃分成3組,{1, 2, 3}, {4, 5}, {6, 7}

int findmin(int n) {
  // TODO
}

題目2(算法):給定一個遞增循環整數數組,從里面找出最小的元素,使用的算法越快越好。特別地,最小的元素可能出現在數組中間。比如:50, 52, 63, 90, 3, 8, 15, 44。

class Problem2 {
  int findmin(int[] arr) {
    //TODO
  }
}

題目3(算法):在二叉排序樹上面找出第3大的節點。注意:不能把二叉樹全量存儲到另外的存儲空間,比如存儲到數組中,然后取出數組的第三個元素。

class TreeNode {
    int value;
    TreeNode left, right;
};

class Problem3 {
  TreeNode find(TreeNode root) {
    // TODO 請完成實現部分
  }
}

題目4(語法):用Java語言實現System#arraycopy數組拷貝,注意:不能直接使用System.arraycopy

class Problem4 {
  public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) {
    // TODO 請完成實現部分
  }
}

題目5(多線程):閱讀下面代碼,在2線程環境下,設計一個方案,判斷無限數據流(Stream)每個正整數是否素數,越快越好

interface Stream {
  long get(); // 獲取下一個需判斷的整數
  void put(boolean result); // 返回整數是否素數的結果
  static boolean isPrimeNumber(long num) { // 判斷一個整數是否素數
    if (num < 2) return false;
    for (long i = 2, s = (long) Math.sqrt(num); i <= s; i++) {
      if (num % i == 0) return false;
    }
    return true;
  }
  static Stream getInstance() {
    try {
      return (Stream) Class.forName("StreamImpl").newInstance(); // 運行環境保證不會異常
    } catch (Exception e) {
      return null;
    }
  }
}
//比如:Stream={1,2,3,4,...}, Result={false,true,true,false,...},注意輸出順序。
public class Problem {
  private Stream stream = Stream.getInstance();
  public static void main(String[] args) {
    Problem instance = new Problem();
    new Thread(() -> {
      while (true) {
        try {
          instance.thread1();
        } catch (InterruptedException e) {

        }
      }
    }, "thread1").start();
    new Thread(() -> {
      while (true) {
        try {
          instance.thread2();
        } catch (InterruptedException e) {

        }
      }
    }, "thread2").start();
  }
  public void thread1() throws InterruptedException {
    // TODO 請完成實現部分
  }
  public void thread2() throws InterruptedException {
    // TODO 請完成實現部分
  }
}

因為之前沒準備,我當時連二叉搜索樹是有序的這個概念都忘了,把二叉搜索樹當做普通的二叉樹去處理了,感覺當時在45分鐘過后,面試官操著一口廣東味的普通話來我和溝通的時候,讓我當時有種直接掛斷電話的沖動,總之,就感覺這次面試體驗很不好,讓我有種想去撞墻的沖動。

也是從這個時候開始,開始意識到要好好準備算法,不然真的是沒有繼續面下去的必要。

微信這邊的面試基本沒有后續了,答得這么差,有后續才怪咧。

后面我的簡歷應該是被收到騰訊的人才庫里去了,于是有深圳那邊的業務開始打電話給我說是要面試。

一開始是深圳的一個做SDK的部門,和我進行了一次騰訊會議的視頻面試。這次基本就是聊技術,這個面試官對我的評價不錯,主要聊了聊我在小紅書做的一些東西和自己平時做的一些技術沉淀,然后問了一些Android相關的技術問題,覺得我的表現不錯,但是因為他們是做SDK的,和我這邊的經歷不是特別匹配,面試官當時也直接說了可能不是特別匹配,但是他說會在面試反饋中給予我比較好的面試評價。

可能也是因為這個原因,后面我的簡歷又被騰訊的其他業務部門撈起來了。

首先是手機QQ團隊,一面面試官問的都是一些Java和Android 基礎問題,但是問的比較多,基本上各個知識點都問到了一些。

一面基本上問了下面一些問題:

  • 做過哪些內存優化

  • 內存抖動,如何定位內存抖動

  • view移動用動畫實現有哪些方式

  • 自己實現區域解碼,decodeFileDescriptor

  • scrollto 和 scrollby 的區別

  • 內存泄漏如何分析

  • mvc,mvp和mvvm的區別

  • mvvm的缺點是什么,mvvm為啥不用DataBinding,不用DataBinding怎么實現雙向綁定

  • leakcanary 的原理

  • 事件沖突如何自己解決

  • RecyclerView和ListView的區別

  • Service和IntentService的區別

  • Service如何stop,bindService的方式如何stop

  • aidl 的原理

  • 多進程通信方式

  • 自己實現過多進程嗎

  • HashMap的原理是什么

  • 紅黑樹的原理是什么

  • Handler可以在多個線程里使用嘛,有幾個消息隊列,每個線程的消息是如何發到另一個線程的

  • aidl 自己寫如何實現

  • 用過哪些設計模式,設計模式

  • 工廠和抽象工廠的區別(因為上面我說在項目中實踐過工廠設計模式,所以他就問了工廠和抽象工廠的區別)
    手Q二面是視頻面試,問的問題是比較抽象一點,感覺一般沒有固定的答案。

  • 如果不采用改變Bitmap config的這種方式,如何做Bitmap的內存優化

  • 網絡優化怎么做

  • 單元測試

  • 硬件加速的原理,硬件加速是如何工作的

  • RecyclerView 滑動到item不可見后,這部分內存時是如何回收的

  • 卡頓檢測怎么做,如何上報

  • 寫個死鎖的代碼

  • 假如字符串中所有字符都不重復,如何輸出字符串的所有組合。例如:abc,結果應是a,b,c,ab,ac,bc,abc。

二面答的問題基本沒怎么答好,有的是自己不怎么涉及這些,有些則是對于某些理解不夠深入。其實我覺得這次面試失敗是因為這個幾個問題沒回答好,我能感覺到面試官有種不想繼續聊下去的沖動了,后面則是象征性地出了一道算法題。

接著收到了QQ音樂的面試邀請,這次面了好幾輪,一開始是那邊的HR給我打了個電話,基本就是聊為啥換工作,能不能去深圳這樣,以及在小紅書的工作內容等等。

接著面了好幾輪,兩輪技術面,一輪交叉面,還有總經理面試,最后還有HR面,因為面的輪次比較多,當時對于面試題也沒有特殊整理,不過大概問的問題都是這些東西,和之前的面試問題大差不差。

面到后來QQ音樂這邊算是通過了,給的Offer還可以。

騰訊這邊還面過騰訊視頻的崗位,這個是在自己懶散的情況下進行的,因為基本確定要去哪了,當時就想著漲漲面試經驗啥的。這次面試基本面試完之后我就覺得沒有后續了。下面是問的一些問題:

算法題:輸入[“eat”,”ate”,””tea”,”and”,”den”] 要求輸出“換位詞”,[[“eat”,”ate”,””tea”],[”and”],[”den”]]

  • 業務上做的有挑戰性的東西是啥
  • RxJava底層進行數據通信的原理
  • RxJava和EventBus做通信的區別
  • 線程的狀態
  • 線程的兩種創建狀態
  • 線程池的種類,以及內部是如何管理線程的,什么時候創建,什么時候讓線程運行

阿里

阿里這邊就讓同事認識的一個阿里員工內推了阿里的崗位,這次面的是淘寶下面的一個業務。當時是在差不多拿到QQ音樂Offer的時候開始的,當時也沒有想太多,反正就是想試試,因為當時想的是,拿不到這邊的機會,就去深圳工作去。

阿里的面試一面問的基本都是業務相關的,基本就是講自己在小紅書做的東西和一些Android基礎知識。這幾次面試我也沒有做什么面試題的記錄。

二面上來也是問技術啥的,后來搞了三個筆試題,一個是排序問題,一個是用棧來模擬隊列,還有一個是寫一個小的商品feed流的demo,難度不是特別大,關于問的一些具體的面試題我也忘了,差不多都是那些東西吧。

最后一面是HR和Leader一起的終面,Leader應該是這個業務線的領導,沒有問具體的技術問題,問的都是一些比較開放的問題,阿里的這次面試整體感覺還算順利吧,后面就是算是通過了,給了Offer。

基本上,自己面試比較順利的幾次都沒有記錄下來。關于Offer的選擇,騰訊相對阿里,杭州相對深圳,壓力要小很多,所以決定去阿里,所以就拒了QQ音樂這邊的機會,但是心里還是蠻喜歡這個工作崗位的。

總結

整體說來,這段時間的面試不能算是成功的,很多面試都沒有通過,通過的還有運氣成分在里面吧,這也提醒我自己要學習的東西還有好多吧,尤其自己在算法這一塊還是比較薄弱的,對大多數人來說,算法題這塊沒有啥捷徑吧,就是多刷題吧。

我記錄這些希望能對面試的人有些幫助吧,因為之前很多人讓我寫面經啥的,我也不太清楚怎么寫,就是把一些問題記錄下來吧,如果你覺得有幫助,可以幫忙點贊分享下,感謝。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。