字節跳動 三次失敗的一面後,58天讀完這份485頁的中高級Java面試題,終獲騰訊offer

抖音一面掛

2020/4/1

  • 介紹一下項目
  • java內部類
  • 匿名內部類爲什麼變量置爲fina
  • 多態介紹一下 原理是什麼 怎麼實現的
  • 設計模式說一下(說了工廠模式、單例、策略) 手寫了個懶漢單例、DCL、餓漢。 問簡單工廠、工廠、抽象工廠區別
  • K個一組反轉鏈表

字節跳直播中臺 頭條客戶端涼經

2020/2/14

  • 抽象類與接口

  • 垃圾回收(然後我說了四種引用什麼時候GC)

  • 什麼時候發生內存泄漏、內部類引用外部類泄漏是什麼原因

  • hashMap怎麼實現,他的get、put是怎麼實現的

  • 死鎖,怎麼避免。

  • synchronized鎖是什麼鎖(我就說了是系統的同步互斥鎖)原理應該是monitor(監視器)

  • 你的[項目]中註冊登錄是怎麼實現的

  • http四次揮手

  • http狀態碼

  • 算法題:leetCode.120 沒做出來。。。

    `class` `Solution {`
    
    `public` `int` `minimumTotal(List<List<Integer>> triangle) {`
    
    `if``(triangle ==` `null` `|| triangle.size() ==` `0``){`
    
    `return` `0``;`
    
    `}`
    
    `//二維數組dp[][]`
    
    `// int[][] dp = new int[triangle.size()+1][triangle.size()+1];`
    
    `// for(int i = triangle.size()-1; i>=0; i--){`
    
    `//     List<Integer> curTri = triangle.get(i);`
    
    `//     for(int j = 0; j<curTri.size(); j++){`
    
    `//         dp[i][j] = Math.min(dp[i+1][j], dp[i+1][j+1]) + curTri.get(j);`
    
    `//     }`
    
    `// }`
    
    `// // 只需要記錄每一層的最小值即可`
    
    `// int[] dp = new int[triangle.size()+1];`
    
    `// for(int i = triangle.size()-1; i>=0; i++){`
    
    `//     List<Integer> curTri = triangle.get(i);`
    
    `//     for(int j  = 0; j<curTri.size(); j++){`
    
    `//         //這裏的dp[j] 使用的時候默認是上一層的,賦值之後變成當前層`
    
    `//         dp[j] = Math.min(dp[j], dp[j+1]) + curTri.get(j);`
    
    `//     }`
    
    `// }`
    
    `// return dp[0][0];`
    
    `//標準On`
    
    `int` `n = triangle.size();`
    
    `int``[] dp =` `new` `int``[n];`
    
    `for``(``int` `i =` `0``; i < n; i++)`
    
    `dp[i] = triangle.get(n -` `1``).get(i);`
    
    `for``(``int` `i = n -` `2``; i >=` `0``; i--) {`
    
    `for``(``int` `j =` `0``; j <= i; j ++) {`
    
    `dp[j] = Math.min(dp[j], dp[j+``1``]) + triangle.get(i).get(j);`
    
    `}`
    
    `}   `
    
    `return` `dp[``0``];`
    
    `//遞歸法`
    
    `//return minimumTotalHelper(triangle, 0, 0, new int[triangle.size()][triangle.size()]);`
    
    `}`
    
    `int` `minimumTotalHelper(List<List<Integer>> triangle,` `int` `row,` `int` `col,` `int``[][] memo){`
    
    `if``(memo[row][col] !=` `0``)` `return` `memo[row][col];`
    
    `if``(row == triangle.size()-``1``){`
    
    `return` `memo[row][col] = triangle.get(row).get(col);`
    
    `}`
    
    `int` `left = minimumTotalHelper(triangle, row+``1``, col, memo);`
    
    `int` `right = minimumTotalHelper(triangle, row+``1``, col+``1``, memo);`
    
    `return` `memo[row][col] = Math.min(left,right) + triangle.get(row).get(col);`
    
    `}`
    
    `}`
    
     |
    

字節跳動 頭條客戶端涼經

2020/1/19

  • 自我介紹

    算法題

  • Q:找出一個數組的長度Top k的升序子數組,並按長度降序輸出。

  • 輸入:[2,1,4,5,8,3,7,10,2,5] k=2

  • 輸出:[1,4,5,8],[3,7,10]

  • 思路:剛開始和麪試官聊思路,我以爲是找出升序子數組然後把他們裏面的元素降序輸出,做完後才發現理解錯題意了。題目的意思就是找出升序子數組,按照子數組的長度降序輸出子數組。。。

`public` `class` `Main {`

`public` `void` `reverse(``int``[] array,` `int` `k){`

`//找升序子數組`

`int``[] pivot =` `new` `int``[k];``//存第i個子數組的開始座標`

`int``[] end =` `new` `int``[k];``//存第i個子數組的結束座標`

`int` `j =` `0``;`

`int` `pivot_temp =` `0``;`

`int` `end_temp =` `0``;`

`for``(``int` `i=``0``; i<array.length;){`

`if``((i != array.length-``1``) && (array[i] > array[i+``1``])){`

`if``(end_temp > pivot_temp){`

`pivot[j] = pivot_temp;`

`end[j] = end_temp;`

`j++;`

`}`

`i++;`

`pivot_temp = i;`

`end_temp = pivot_temp;`

`}``else``{`

`i++;`

`end_temp++;`

`}`

`}`

`/*`

`按照子數組長度降序`

`*/`

`int``[] len =` `new` `int``[k];`

`int``[] index =` `new` `int``[k];``//存儲降序順序  index 與len 一一對應`

`for``(``int` `i=``0``; i<k; i++){`

`len[i] = end[i] - pivot[i] +``1``;`

`index[i] = i;`

`}`

`for``(``int` `i=``0``; i<k; i++){``//選擇排序   //index[i]  是存Top i長度max的數組的索引`

`for``(``int` `w=i; w<k; w++){`

`if``(len[w] > len[i]){`

`int` `temp = len[w];`

`len[w] = len[i];`

`len[i] = temp;`

`int` `index_temp = index[w];`

`index[w] = index[i];`

`index[i] = index_temp;`

`}`

`}`

`}`

`//輸出`

`for``(``int` `i=``0``; i<k; i++){`

`System.out.print(``"["``);`

`for``(``int` `w=pivot[index[i]]; w=end[i]; w--    沒把``for``循環條件改回來導致輸出爲空,只說了思路開始問java基礎。好虧啊這種窒息操作`

`if``(w == end[index[i]]){`

`System.out.print(array[w]);`

`}``else``{`

`System.out.print(array[w] +` `","``);`

`}`

`}`

`if``(i == k-``1``){`

`System.out.print(``"]"``);`

`}``else``{`

`System.out.print(``"],"``);`

`}`

`}`

`}`

`public` `static` `void` `main(String[] args) {`

`int``[] test =` `new` `int``[]{``2``,``1``,``4``,``5``,``8``,``3``,``7``,``10``,``2``,``5``};`

`Main main =` `new` `Main();`

`main.reverse(test,``2``);`

  • Java基礎

    • 說一說Java內存模型、JVM內存模型* HashMap怎麼實現的* 線程 wait()和sleep()區別* 線程安全怎麼實現* 說一說垃圾回收算法

    Android基礎(估計是看我有Android基礎才問的。0基礎不會問,我看其他0基礎的問的大都是計網和java基礎!啊!沒複習啊!)

  • Android頁面繪製流程

  • Handler在子線程怎麼使用

  • 就完了......
    資料庫分享:


點此進入資料免費獲取通道。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章