参加的是data数据平台-大数据开发实习生的岗位面试,一面二面一起,全程视频面试。两位面试官态度都很好,当提的问题我答不上来时,面试官会耐心得做些引导,体验还是比较好的。
一面
- 自我介绍
- 项目经历
主要聊的是实验室做的一个数据流可视化分析平台,面试官问的问题很专业。简历上有三个项目,除了数据流可视化分析平台之外还有两个大学做的项目,面试官没怎么问,他让我自己讲下亮点,于是我就简单说了说放这两个项目的目的——证明下自己的工程能力和算法能力。
这一部分和面试官聊的挺多,自认为发挥的还可以。
- JVM基础
3.1 JVM内存结构
3.2 类加载
3.3 垃圾回收
3.4 线程池ThreadPool
我基本上把JVM准备的点都说了,过程比较顺利,对自己答得也比较满意。
- 做算法题
去除链表中的所有重复元素,返回去除后的链表指针。使用哨兵节点,解决起来比较方便。
public static ListNode deleteDuplicates3(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode last = dummyHead;
ListNode cur = head;
while(cur != null && cur.next != null){
if (cur.val == cur.next.val){
int val = cur.val;
while(cur != null && val == cur.val){ // 删除所有重复节点,仅保留只出现一次的节点。
cur = cur.next;
last.next = cur;
}
} else {
last = cur;
cur = cur.next;
}
}
return dummyHead.next;
}
一面结束后,面试官让我在线等会,马上进行二面。等了大概10多分钟,二面就开始了。
二面
- 实验室研究课题介绍
面试让我介绍下目前研究课题的内容,我就把手头在做任务的背景和方法介绍了一下。 - Java基础
2.1 static关键字的理解
2.2 Object类中方法介绍,hashCode()、equals()、wait()、notify()、toString()等
2.1 回答还OK,2.2回答不是很好,因为也没怎么准备。
- 数据库
2.1 MySQL索引理解
2.2 B树与B+树的区别
这一部分自我感觉还OK。
- 操作系统
4.1 进程间通信的几种方式
4.2 进程调度
知识盲点,回答的一塌糊涂。
- 计算机网络
5.1 tcp拥塞控制和流量控制
回答的不是很满意。
- 做算法题
6.1 输出二叉树最左下节点的值。解题思路:层次遍历,从右往左依次进队列,最后出队列的即为输出。
/**
* 寻找树中最左下角的值
* @param root
* @return
*/
public int findBottomLeftValue(TreeNode root) {
TreeNode cur = null;
//队列
Queue<TreeNode> queue = new LinkedList();
//根节点入队
queue.offer(root);
while(!queue.isEmpty()){
//出队一个元素
cur = queue.poll();
//按顺序入队其右孩子和左孩子
if(cur.right != null)
queue.offer(cur.right);
if(cur.left != null)
queue.offer(cur.left);
}
//所有元素出队后拿到的就是最后一个节点,返回
return cur.val;
}
6.2 第一个错误的版本。解题思路:二分法。
public int firstBadVersion(int n) {
int left = 1;
int right = n;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (!isBadVersion(mid)) {
left = mid + 1;
} else {
if(mid == 0 || !isBadVersion(mid - 1)) return mid;
right = mid - 1;
}
}
return -1;
}
两道算法写的比较顺利,可能是面试官太nice了,没出太难的算法题。
- 提问环节
7.1 由于二面中2-5回答的不算很好,我就解释下,说我理论知识需要加强;不过平时工程能力还OK,上手速度快,善于解决问题,属于问题导向型。
7.2 问了一下data数据平台部门使用的大数据框架,比如spark、flink,面试官说都会用到。
二面结束后,我就问HR小姐姐什么时候会出结果。没想到HR很快回复了,说我二面通过了,并且预约了三面的时间。天呐,还有三面。
三面
本来HR小姐姐说,这是最后一面,我就理解为HR面,没想到啊,竟然还是技术面。弄了半天,HR小姐姐搞错了,三面还是技术面,过了之后才是HR面(最后一面)。整个面试过程持续2个小时,真的是太漫长了~不过面试官还是很nice的,会有提示和引导。
不说废话了,进入正题。
- 自我介绍+项目介绍
回答和一二面差不多。
- 算法题目
2.1 MapReduce实现PV统计
MapReduce代码不是很熟,面试官说让我讲讲思路就可以。
问题延伸:1. 堆排序应该放到哪个阶段?——Reduce阶段;2. 建堆的时间复杂度——O(n)
2.2 自己实现一个BlockingQueue。
public class BlockingQueue {
private final Queue<String> queue = new LinkedList<>();
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public String get() {
try {
lock.lock();
while (queue.peek() == null) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return queue.remove();
} finally {
lock.unlock();
}
}
public void put(String request) {
try {
lock.lock();
queue.offer(request);
condition.signalAll();
} finally {
lock.unlock();
}
}
}
没回答好,不过在面试官不断提示下,还是有些思路——使用wait和notify实现。问题延伸:notify和notifyAll有什么区别。
2.3 DAG的拓扑排序
因为这一部分和项目介绍相关,所以比较熟。思路就是统计一下每个节点的入度,输出所有入度为0的节点。但面试官说能不能不先遍历图,直接输出。面试官真的很耐心,提示我参考二叉树的后序遍历——先子节点然后父节点,注意使用栈,和记录访问日志。
public class DAG {
class Node{
String val;
List<Node> children;
public Node(String val){
this.val = val;
this.children = new ArrayList<>();
}
public void addChild(Node node){
this.children.add(node);
}
}
private Stack<String> stack;
private Set<String> visited;
public DAG(){
stack = new Stack<>();
visited = new HashSet<>();
}
public void core(Node root){
if (root == null || visited.contains(root.val)){
return;
}
for (int i = 0; i < root.children.size(); i++){
core(root.children.get(i));
}
if (!visited.contains(root.val)){
stack.push(root.val);
visited.add(root.val);
}
}
public String topoTraverse(Node root){
core(root);
StringBuilder stringBuilder = new StringBuilder();
while (!stack.isEmpty()){
stringBuilder.append(stack.pop());
}
return stringBuilder.toString();
}
public static void main(String[] args) {
DAG dag = new DAG();
Node a = dag.new Node("A");
Node b = dag.new Node("B");
Node c = dag.new Node("C");
Node d = dag.new Node("D");
Node e = dag.new Node("E");
Node f = dag.new Node("F");
a.addChild(b);
a.addChild(c);
b.addChild(d);
c.addChild(d);
d.addChild(e);
e.addChild(f);
a.addChild(f);
System.out.println(dag.topoTraverse(a));
}
}
- 爱好
- 提问环节
虽然感觉自己发挥不咋的,但还是过了。可能是面试官看中了我的潜力~~~
HR面
顺利通过~
内推内推,很认真的内推,免笔试的那种哦
号外!号外! 字节跳动研发提前批开始啦~大量坑位,欢迎大家来占哦~网申时间6月16-7月16日,机会多多,快快投递简历吧,内推码:GHT9VNC
感兴趣的同学可以留言交流~
网友评论