0%

快手大数据开发实习生一面面经

面试描述

这次还是挺悬的, 幸亏编程题想出来了, 想不出来就gg了

  1. 自我介绍
  2. 问了实习中做的工作内容, 实习里面spark怎么用什么的
  3. spark了解的多吗, 讲一讲spark执行任务的流程
  4. 从哪里可以看出spark executor里面任务的执行情况?
  5. 又问到DAG图执行的过程, 这里我没太懂面试官的意思, 心想DAG图还有什么执行过程? 然后就回答从textFile()方法或者persist()开始. 后来听面试官的解答才知道问的不是这个, 问的知识点是RDD的惰性执行操作. 从最后一个rdd开始求出需要什么父rdd, 然后依次向前执行, 不action不执行.
  6. 实习里面kafka怎么用的?
  7. kafka实现高可用的方式?(分区机制, leader和follower,ack参数)
  8. kafka选举?(kafka控制器, leader epoch)
  9. Java线程池(7个参数, 提交一个任务会经过怎样的流程)
  10. JVM垃圾回收算法. (说了三种, 和CMS收集器). 又让讲讲G1收集器

编程题问的是复原ip地址. 也是很经典的一道题了. leetcode 93

但这道题很久之前做过的, 有点忘了. 幸亏面试的时候想起来了, 不然又gg了.

需要的边界条件还是比较多的. 要考虑每一组ip是不是0开头, 是不是大于255, 遍历完之后ip段数是不是小于4或大于4, 这些情况都是需要剪枝排除掉的. 我写的时候忘考虑ip段数是不是小于4这个条件了. 还好写完之后只让讲思路, 要不然现场写bug太尴尬了.

最后问面试官评价, 面试官说基础掌握的还可以, 但是不深入, 源码看的少(事实上我之前根本没看过spark源码). 以后还是要多学源码多深入吧.

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
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.Scanner;
import java.util.*;
public class Main {
public ArrayList<List<String>> string2ips(String s){
if(s == null || "".equals(s)){
return new ArrayList<>();
}
List<List<String>> ans = new ArrayList<>();
List<String> curr = new ArrayList<>();
int index = 0;
dfs(ans, curr, index, s);
return ans;
}
private void dfs(List<List<String>> ans, List<String> curr, int index, String s){
if(index == s.length() && curr.size() == 4){
ans.append(curr); // 这里应该是 ans.append(new ArrayList<String>(curr));
}
if(curr.size() > 4){
return;
}
char ch = s.charAt(index);
String last = curr.get(curr.size() - 1);
if(ch == '0'){
String last_new = last + ch;
if(Integer.valueOf(last) <= 255){
curr.set(curr.size()-1, last_new);
dfs(ans, curr, index + 1, s);
curr.set(curr.size()-1, last);
}
}
else{
last = last + ch; // 这里应该是 String last_new = last + ch;
if(Integer.valueOf(last) <= 255){
curr.set(curr.size()-1, last_new);
dfs(ans, curr, index + 1, s);
curr.set(curr.size()-1, last);
}
curr.add(String.valueOf(ch));
dfs(ans, curr, index + 1, s);
curr.remove(curr.size() - 1);
}
}
}