0%

美团核心本地商业一面

2025.05.09 30min
部门:核心本地商业-业务研发平台
八股+手撕,问了一个项目问题,也没问大模型

面试官先介绍部门,酒店业务
自我介绍
八股:

  1. 集合有什么接口和实现类
  2. Java内存模型
  3. 垃圾回收怎么实现的
  4. 在开发中用到哪些集合
  5. 动态规划解决的是什么问题
  6. BFS 和 DFS 用在什么场景
  7. git的常用命令
  8. http和https的区别
  9. 生产者消费者模式的应用场景
  10. Redis持久化方式
  11. SpringMVC流程
  12. 项目中怎么用Redis优化的

手撕:
最长回文子序列
合并两个有序链表
单例模式

最长回文子序列思路

子序列是可以不连续的

区间dp

状态定义:dp[i][j]定义第i个字符到第j个字符的子串中最长回文子序列的长度

状态转移:

  • s[i] == s[j] 时,dp[i][j] = dp[i + 1][j - 1] + 2;
  • s[i] != s[j] 时,dp[i][j] = Math.max(dp[i][j - 1], dp[i + 1][j]);

答案是:dp[0][n - 1]

由于转移方程是i要根据i+1求,因此i要从大到小遍历,j是从小到大便利

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public int longestPalindromeSubseq(String s) {
char[] str = s.toCharArray();
int n = str.length;
int[][] dp = new int[n + 1][n + 1];
for(int i = n - 1; i >= 0; i -- ) {
for(int j = i; j < n; j ++ ) {
if(i == j) {
dp[i][j] = 1;
continue;
}
if(str[i] == str[j]) {
dp[i][j] = dp[i + 1][j - 1] + 2;
}else {
dp[i][j] = Math.max(dp[i][j - 1], dp[i + 1][j]);
}
}
}
return dp[0][n - 1];
}
}

最长回文子串

子串一定是连续的一段

状态定义:dp[i][j]定义第i个字符到第j个字符的子串是否是回文子串

状态转移:

  • s[i] == s[j] && dp[i + 1][j - 1] == true 时,dp[i][j] = true;
  • s[i] != s[j] 时,dp[i][j] = false;

暴力枚举所有子串,判断是否是回文串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public String longestPalindrome(String s) {
char[] str = s.toCharArray();
int n = str.length;
boolean[][] dp = new boolean[n][n];
int maxlen = 1;
int maxi = 0;
for(int i = 0; i < n; i ++ ) {
dp[i][i] = true;
}
for(int len = 2; len <= n; len ++ ) {
for(int i = 0; i + len - 1 < n; i ++ ) {
int j = i + len - 1;
if(str[i] == str[j]) {
if(len == 2) {
dp[i][j] = true;
}else {
dp[i][j] = dp[i][j] || dp[i + 1][j - 1];
}
if(len > maxlen) {
maxlen = len;
maxi = i;
}
}else {
dp[i][j] = false;
}
}
}
return s.substring(maxi, maxi + maxlen);
}
}

双重检查锁单例模式

私有实例,私有构造方法,公有接口获取实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Singleton {
private static volatile Singleton instance;
private Singleton() {};

public static Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}