虾皮测开提前批复活成功,准备HR面
虾皮已拿意向书,感谢牛客
@牛客人品酱 攒人品offer++
先mark一下,有空写面经。两次面试主要都在问八股文。
8.5更新:被捞了,明天再面一轮复试
8.6更新
面了15分钟,讲了讲自己在美团的上一个需求是啥,怎么测的,聊了聊研究生的项目,问了点八股文,做了道智力题烧绳子。自我感觉不错,许愿HR面(虾皮的面试很玄学)
8.10更新 让内推的同学查了一下,已经进入HR面了,冲!
8.12更新
十一点半收到了hr的电话,电话面了15分钟,求求了,给个offer吧
7.26 二面
1.自我介绍
2.半个小时八股文
3.熟悉的数据结构和算法
数据结构:线性表(数组和链表),栈和队列,键值对,二叉树,堆
算法:搜索算法和排序算法
4.数据结构具体应用?
数组和链表:存储数据
堆:堆空间
栈:java虚拟机栈和本地方法栈
队列:消息队列,kafka
5.快速排序原理,知道哪些快速排序?https://segmentfault.com/a/1190000004410119
自己写了三种,献丑了
//快排1,交换法,不稳定,NlogN public static void quickSort1(int[] arr, int start, int end){ if(start > end){ return; } int i = start; int j = end; while (i < j){ while (j > i && arr[j] > arr[start]){ j--; } while(i < j && arr[i] <= arr[start]){ i++; } exchange(arr,i,j); } exchange(arr, start, i); quickSort1(arr, start,i-1); quickSort1(arr, i+1, end); } //快排2,填坑法 public static void quickSort2(int[] arr, int start, int end){ if(start >= end){ return; } int sentry = arr[start]; int i = start, j = end; while (i < j){ while (arr[j] > sentry && i < j){ j--; } arr[i] = arr[j]; while (arr[i] <= sentry && i < j){ i++; } arr[j] = arr[i]; } arr[j] = sentry; quickSort2(arr,start, j-1); quickSort2(arr, j+1, end); } //快排3,顺序遍历法 public static void quickSort3(int[] arr, int start, int end){ if(start >= end){ return; } int sentry = arr[end]; int storeIndex = start; for (int i = start; i < end; i++) { if(arr[i] < sentry){ exchange(arr, i, storeIndex); storeIndex++; } } exchange(arr,storeIndex,end); quickSort3(arr,start,storeIndex-1); quickSort3(arr,storeIndex+1,end); }
6.什么是桶排序?
7.数据库索引相关,索引是什么,索引的底层实现,不能命中索引的场景,为什么不能命中?
8.线程与进程?什么是线程安全问题?乐观锁和悲观锁?具体的应用场景。乐观锁:AtomicInteger; 悲观锁:synchronized; select for update
9.TCP三次握手,状态
10.点击url的全过程
11.进程间的通信方式
12.测试用例:支付宝转账功能
13.代码题:中文数字转换成阿拉伯数字
public static int chineseToInt(String s){ Map<String, Integer> map = new HashMap<>(); map.put("零", 0); map.put("一", 1); map.put("二", 2); map.put("三", 3); map.put("四", 4); map.put("五", 5); map.put("六", 6); map.put("七", 7); map.put("八", 8); map.put("九", 9); map.put("万", 10000); map.put("千", 1000); map.put("百", 100); map.put("十", 10); int res = 0; char[] chars = s.toCharArray(); Stack<Integer> stack = new Stack<>(); for (int i = 0; i < chars.length; i++) { if(map.get(String.valueOf(chars[i])) < 10){ stack.push(map.get(String.valueOf(chars[i]))); }else if(map.get(String.valueOf(chars[i])) == 10000){ res = res * 10000; }else if(map.get(String.valueOf(chars[i])) == 10 && stack.isEmpty()){ res = res + 10; }else { res = res + stack.pop() * map.get(String.valueOf(chars[i])); } } if(!stack.isEmpty()){ res = res + stack.pop(); } return res; }
7.27 感谢信