一面
算法问了4道都比较简单,分别考的二分,递归,双指针以及动态规划。
1.二分搜索
力扣原题,注意边界条件,以及是否能取等号即可。
2.二分搜索(递归实现)
代码如下:
public int search(int[] nums, int left, int right, int target) {
while (left <= right){
int mid = left + (right - left) / 2;
if (nums[mid] == target){
return mid;
}else if (nums[mid]< target){
return search(num, mid + 1, right, target);
}else{
return search(num, left, mid - 1, target);
}
}
return -1;
}
3.双指针
递增数组,判断数组中是否存在两个数之和为target,思路是双指针,一个begin,一个end,每次移动一个指针。
代码如下:
public int[] twoSum(int[] numbers, int target) {
int p1 = 0;
int p2 = numbers.length - 1;
while (p1 < p2){
int sum = numbers[p1] + numbers[p2];
if (sum == target){
return new int[]{p1 + 1, p2 + 1};
} else if (sum < target){
p1++;
} else {
p2--;
}
}
//无解
return new int[]{-1, -1};
}
4.最长递增子序列LIS(动态规划)
DP代码如下:
public int lengthOfLIS(int[] nums) {
int dp[] = new int[nums.length];
dp[0] = 1;
int maxSeqLen = 1;
for (int i=1; i<nums.length; i++) {
//初始化为1
dp[i] = 1;
for (int j = 0; j <= i; j++) {
//对dp[i]进行更新,严格递增
if (nums[i] > nums[j]){
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
maxSeqLen = Math.max(maxSeqLen, dp[i]);
}
return maxSeqLen;
}
最优时间复杂度为O(nlogn)
写完四道算法之后,开始问项目,问了大概半小时项目,简单的问了一下八股文。
八股文
1.MapReduce的整个过程原理。
2.Spark参数executor.memory与executor.memoryOverhead的区别。
然后简单介绍了一下美团平台做的啥业务,balabala一堆,也不太想听。
二面
项目聊了40分钟,中间讲了一下他们公司做的业务。
然后问我大数据输入流下Flink程序如何优化(他们那边流程序一次跑一天),我说先选择stateBackend,选rocksdb,之后要进行黑盒参数优化。
问了我Spark程序核内比如何设置比较合理,怎样避免OOM。我说核内比的大小是由硬件环境以及应用程序的特征决定的,基于经验的话,我们实验室的鲲鹏ARM机器上(288核 360G内存),1:1.5的核内比就可以,在华为云(192核 300G内存)的X86机器上, 1:3以及1:4比较合适。
又问了我遇见过executorMemoryOverhead空间不足报错的问题没,我说没有,只遇见过参数不合理的时候,超过了yarn分配的资源上限导致报错,并未遇见过不足的问题。
之后问我大数据集下,应该调整哪些配置参数的值来更好地进行Spark SQL程序的优化,我回答了spark.sql.shuffle.partition以及spark.broadcast.threshold。
又问了我Spark程序优化以及Flink程序优化的这些参数大概选了多少个,选了哪些,以及是如何选择出来的。
八股文没有问就,面试官让我写了一道SQL以及一道算法,八股文没有问。
SQL,聚合排序以及Join的操作,我说不会写SQL,就说了一下思路。
算法:两数求和(逆序链表)
考察的链表基础知识,整一个carry进位即可,按照顺序求解。
然后又介绍了一下他们公司的业务balabala,问我的意向之类的。