面试复盘|美团一面挂
美团
美团到家事业群,内推:微信 base:北京
投递:20210815 后端开发工程师
笔试:20210822
全排列问题;字符串;括号匹配;数组操作问题
1. 全排列+字典序排序
package meituan; import java.util.*; /** * 全排列问题 * 给定数组长度和数组;输出排列数和排列(按字典序给出) * 60%的样例,数组长度不超过3;所有的样例n不超过6 * 数组中的数字在1,n范围内,存在重复出现的值 */ public class Solution1 { public static List> permute(int[] nums) { List> res = new ArrayList(); List output = new ArrayList(); for (int num : nums) { output.add(num); } int n = nums.length; backtrack(n, output, res, 0); return res; } private static void backtrack(int n, List output, List> res, int first) { if (first == n) { res.add(new ArrayList(output)); } for (int i = first; i < n; i++) { Collections.swap(output, first, i); backtrack(n, output, res, first + 1); Collections.swap(output, first, i); } } public static void main(String args[]) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] array = new int[n]; for (int i = 0; i < n; i++) { array[i] = sc.nextInt(); } int cnt = 1; // 排列计数 List> rank = new ArrayList(); if (n == 1) { System.out.println("1"); System.out.println("1"); } if (n == 2) { System.out.println(2); System.out.println("1 2"); System.out.println("2 1"); } rank = permute(array); System.out.println(rank); } }
2. 操作字符串
package meituan; import java.util.HashMap; import java.util.Map; import java.util.PriorityQueue; import java.util.Scanner; /** * 字符串处理: * 给定字符串和n次操作,有两种操作,由1 2标记, * 1 表示往s后插入字符; * 2 表示查询和当前位置字符相同的最近的另一个位置,不存在输出-1 */ public class Solution2 { private static Map> hashmap = new HashMap(); public static void add(char c, int pos) { PriorityQueue queue = hashmap.getOrDefault(c, new PriorityQueue()); queue.add(pos); hashmap.put(c, queue); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 原字符串 String s = sc.nextLine(); int length = s.length(); // 操作次数 int n = sc.nextInt(); // 计数 for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); add(c, i + 1); } // 新增字符 StringBuilder sb = new StringBuilder(s); // 记录添加的次数,用于计算添加后新字符的位置 // System.out.println("map:" + hashmap); for (int i = 0; i < n; i++) { int op = sc.nextInt(); // 末尾添加字符 if (op == 1) { char c = sc.next().charAt(0); sb.append(c); length++; add(c, length); } // 判断最近的同字符位置 if (op == 2) { int pos = sc.nextInt(); if (pos < length) { char cc = sb.charAt(pos - 1); Object[] positions = hashmap.get(cc).toArray(); if (positions.length == 1) { System.out.println("-1"); break; } int ii = 0; // 优先队列中的位置 for (int j = 0; j < positions.length; j++) { if (pos == (int) positions[j]) { ii = j; break; } } if (ii == 0) { System.out.println(Math.abs((int) positions[0] - (int) positions[1])); } else if (ii == positions.length - 1) { System.out.println(Math.abs((int) positions[ii] - (int) positions[ii - 1])); } else { System.out.println(Math.min(Math.abs((int) positions[ii] - (int) positions[ii - 1]), Math.abs((int) positions[ii] - (int) positions[ii + 1]))); } } } } } }
3. 括号匹配问题
package meituan; import java.util.Scanner; import java.util.Stack; /** * "阔浩"序列-->括号嵌套问题 * null --> 1 */ public class Solution3 { public static void main(String args[]) { Scanner sc = new Scanner(System.in); String s = sc.next(); int res = 1; if (s == null || s.equals("")) System.out.println(1); Stack stack = new Stack(); // 遍历字符串 for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == '(') { stack.push(0); } else { int top = stack.peek(); top = top == 0 ? 2 : top + 1; stack.pop(); if (stack.isEmpty()) res *= top; else { int sco = stack.pop(); sco *= top; stack.push(sco); } } } System.out.println(res); } }
4. 数组操作:
package meituan; import java.util.Scanner; /** * 小美当上了会计。她现在拿到了n个开支数据 a[1],a[2],…,a[n],现在她想稍微对这些数据做一些统计。 * * 小美有三种想统计的信息。第一种是她选择一个区间[L,R],希望知道a[L] + a[L+1] + … + a[R]等于多少,第二种是她选择一个区间[L,R],希望知道a[L],a[L+1],…,a[R]这些数据的有效值是多少。第三种是她选择一个区间[L,R],希望知道a[L],a[L+1],…,a[R]的最大值是多少。 * * 一组数据b[l],b[2],…,b[r]的有效值,定义为 * * * 输入描述 * 第一行一个整数n,表示一共有n个数。 * * 第二行n个整数,a[1],a[2],…,a[n],表示小美拿到的数据分别是哪些。 * * 第三行一个整数m,表示一共有m个询问。 * * 接下来m行,每行三个整数,opt, L, R,当opt=1时表示是第一种询问, opt=2时表示第二种询问,opt=3时表示第三种询问。(1 <= opt <= 3,1 <= L <= R <= n) * * 数据保证每个收支数据a[i]满足 -1000 <= a[i] <= 1000。 * * 统计次数m满足1 <= m <= 500。 * * 其中,对于60%的数据n满足1 <= n <= 1,000。 * * 对于100%的数据n满足1 <= n <= 100, 000。 * * 输出描述 * 输出m行,每行一个数,表示该行对应询问的答案。 */ public class Solution4 { public static int sum(int[] nums, int l, int r) { int s = 0; for (int j = l - 1; j < r; j++) { s += nums[j]; } return s; } public static int maxN(int[] nums, int l, int r) { int max = 0; for (int j = l - 1; j < r; j++) { if (nums[j] > max) max = nums[j]; } return max; } public static void main(String args[]) { Scanner sc = new Scanner(System.in); // 数组长度 int n = sc.nextInt(); // n 个数据 int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = sc.nextInt(); } // 操作数 int m = sc.nextInt(); // op标号(123),左右区间 for (int i = 0; i < m; i++) { int op = sc.nextInt(); int l = sc.nextInt(); int r = sc.nextInt(); int s = sum(nums, l, r); switch (op) { case 1: System.out.println(s); break; case 2: int temp = 0; for (int j = l - 1; j < r; j++) { temp += (s - nums[j]) * (s - nums[j]); } System.out.println(temp); break; case 3: System.out.println(maxN(nums, l, r)); break; } } } }
一面:20210901
1. 自我介绍5min
2. 项目的难点3min 爬虫的数据格式处理和对应的数据库存储
3. 手撕18min:寻找一个链表的环的入口节点-快慢指针
4. 【Java】
int和Integer的区别,自动装箱拆箱的区别,==和equals的区别;
异常
ArrayList和LinkedList、vector的区别,是否线性安全,如何保证
synchronized和Lock的区别、CAS、底层实现、AQS
5. 【MySQL】
事务隔离级别、解决和仍存在的问题、具体如何解决这些问题的;
B+树
MVCC
6. 【JVM】
类加载机制
双亲委派机制
7. 最近在读的技术类的书
#面试复盘##美团##内推#