算法问了4道都比较简单,分别考的二分,递归,双指针以及动态规划。
力扣原题,注意边界条件,以及是否能取等号即可。
代码如下:
- 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;
- }
递增数组,判断数组中是否存在两个数之和为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};
- }
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)
写完四道算法之后,开始问项目,问了大概半小时项目,简单的问了一下八股文。
然后简单介绍了一下美团平台做的啥业务,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以及一道算法,八股文没有问。
考察的链表基础知识,整一个carry进位即可,按照顺序求解。
然后又介绍了一下他们公司的业务balabala,问我的意向之类的。