文章目錄
- 美團一面面經
-
- 面試内容
- 小結
美團一面面經
面試内容
1、自我介紹
2、怼項目(立項緣由,負責子產品,項目功能)
3、架構選型(後端 springboot ,ORM 使用 mybatis)
4、項目中的難點(多表查詢,使用 xml 實作)
5、使用 xml 的好處(這個我一時還真想不起來)
6、前後端分離項目,是如何部署的(vue 打包成靜态資源,使用 nginx 部署 )
7、權限管理是怎麼做的(權限表 user user_role role 表)
8、如果要将權限粒度細到按鈕,該怎麼辦(role role_quality 表,将不同角色對應的權限資訊存入資料庫,每次登入的時候從資料庫中查出來)
9、登入逾時怎麼做(登入之後,将登入資訊存入 redis 緩存)
10、redis 逾時使用的什麼函數(這個沒答出來,後來查了一下,直接在設定的時候添加逾時時間即可
stringRedisTemplate.opsForValue().set("baike", "100", 60 * 10, TimeUnit.SECONDS);
)
11、鎖的實作,你有什麼思路(synchronized,Lock,操作之前擷取所有資源)
12、synchronized 怎麼使用(對象鎖,方法使用 synchronized)
13、Lock 怎麼使用
14、Lock 的底層實作(Lock -> 管程(java 實作)-> mutex 鎖(OS 實作))
15、AQS (沒複習到…)
16、線程怎麼實作排隊
17、消息隊列的作用(防止瞬時高并發下的伺服器當機,削峰填谷)
18、消息隊列某個請求出錯,但是後續還希望再次執行這個請求,怎麼辦
19、對出錯的請求設定一個重試次數,消息隊列是怎麼實作的
20、HashMap put 的執行流程(hash函數 -> 放入 -> 出現沖突,沖突解決(連結清單,紅黑樹)-> 負載因子,擴容)
21、算法
算法面試官給我放了4道,我選了第三和第四題
- 算法題1:數組去重(給一個有序數組,原地去重,使用雙指針)
public int removeDuplicates(int[] nums) {
if (nums.length<=1) return nums.length;
int l=1,r=1;
while (r<nums.length) {
if (nums[r]!=nums[r-1]) {
nums[l]=nums[r];
l++;
}
r++;
}
return l;
}
- **算法題2:**找數組所有子集(
的所有子集為[1,2,3]
)[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
回溯題,為了求穩,當時沒選
private List<List<Integer>> res = new ArrayList<>();
private List<Integer> track = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
dfs(0,nums);
return res;
}
public void dfs(int index,int[] nums) {
// 遞歸終止
if (index>=nums.length) {
// 一定要新 new 一個 List
res.add(new ArrayList<>(track));
return;
}
// 目前位置選
track.add(nums[index]);
dfs(index+1,nums);
track.remove(track.size()-1);
// 目前位置不選
dfs(index+1,nums);
}
- **算法題3:**兩數之和(一個排好序的數組,找和為 target 的兩個數,如果有多個答案,找乘積最小的)
經典雙指針題目,不是很難,為了求穩選了它
- **算法題4:**找一組數中缺少的最小的正整數(
答案是[-1,1,3,4]
,2
答案是[2,3,4,5]
)6
這道題我給的思路是建構小根堆,然後依次取根,找到非負非連續的兩個數,其中間的數就是我們的答案
我就是把建堆的過程寫了,後面的實作說了個思路
其實用排序也可以寫,但是複雜度比用堆大
public void buildHeap(int[]arr,int n) {
for (int i = (n/2)-1; i >=0; i--) {
heapify(arr,i,n);
}
}
public void heapify(int[]arr,int i,int n) {
while (i*2+1<n) {
int child = i * 2 + 1;
if (child+1<n && arr[child]>arr[child+1]) child++;
if (arr[child]>=arr[i]) return;
swap(arr,i,child);
i=child;
}
}
public void swap(int[]arr,int x,int y) {
int tmp = arr[x];
arr[x]=arr[y];
arr[y]=tmp;
}
22、你還有什麼問題嗎?(部門負責的業務,我的表現)
小結
這次面試寫算法的時間比較多, OS 計網啥的都沒問,花力氣準備的 JVM 也沒考到
還是那個問題, JUC 那塊兒要好好看,現在就屬這一塊兒還比較薄弱
還有就是有空要看看集合的底層源碼