Welcome everyone

跟谁学 视频二面

面试 汪明鑫 742浏览 0评论

在线教育公司,目前排前三名应该就是好未来,跟谁学,猿辅导

面了一个半小时,面试官也很认真

比较重基础和算法吧

面试中还聊到百度的文化,曾经互联网中的黄埔军校!

 

 

  • 自我介绍
  • 项目介绍
  • 重载和重写
  • 重载和重写的返回值有没有限制
  • 垃圾回收算法
  • mysql B+ 树 比 普通二叉树好在哪里
  • kafka相关概念和基础
  • kafka比其他mq好在哪里

 

  • 在有序数组中查找第一个出现的数 (变异版二分查找)
//查找第一个等于的
    public static int searchFirstEqual(int[] a, int n, int target){
        int low = 0;
        int high = n-1;
        while(low <= high){
            int mid = (low+high)/2;
            if(a[mid] < target){
                low = mid + 1;
            }else if(a[mid] > target){
                high = mid - 1;
            }else {  //已经找到等于,但不一定是第一个等于的,所以需要往前一个看一看
                //如果mid已经到0了或者mid前面没有等于目标值得
                if(mid == 0 || a[mid-1]!=target){
                    return mid;
                }else {
                    high = mid -1;
                }
            }
        }
        return -1;
    }

 

 

  • 数组中一定有一个数超过数组大小的一半,找到这个数

 

1,傻瓜法 : HashMap存数据的出现次数,超过数组一半则return

 

2,二逼法: 数组排序,数组中间的值一定是需要找的值 (排序的时间复杂度)

 

3,抵消法:出现不相等的数,两者抵消,最后剩的数一定是超过数组一半的数,就算和另一小半的数一一抵消,剩下的也还有数,定是超过数组大小一般的数

我一开始说可以搞个栈,面试官说没必要这么麻烦

我就考虑创了个类来记录num和对应的count

初始num = arr [0], count = 1

遇到不相等的,且count = 1 就抵消,num= -1,count = 0;

遇到不相等的,且count > 1  抵消一个,num不变,count –;

遇到相等的,num不变,count++;

坑坑洼洼也算写出来了。。。算法还是我的软肋啊,特别在纸上写更是恶心

 

 

抵消法代码如下:

package pers.wmx.interview;

/**
 * 数组中一定有一个元素超过数组大小的一半
 *
 * @author wmx
 * @date 2020-02-11
 */
public class findNumLargeThanHalfArray {

    //4 2 2 2 2 1 5
    //2的个数大于数组大小的一半
    public static int findNum(int arr[]){
        CountNum countNum = new CountNum();
        countNum.num = arr[0];
        countNum.count = 1;

        for (int i = 1; i < arr.length; i++) {
            if(countNum.num != -1 && arr[i] !=  countNum.num){
                if(countNum.count == 1){
                    //表示前面遍历的数据都一一抵消了
                    countNum.num = -1;
                }
                //num不变,说明num还未全被抵消,比如有已经遍历了3个2,才被抵消一个2
                countNum.count --;
            }else{
                countNum.num = arr[i];
                countNum.count ++;
            }
        }

        //最终幸存者
        return countNum.num;

    }

    public static void main(String[] args) {
        int arr[] = {4,2,2,2,2,1,5};
        int num = findNum(arr);
        System.out.println(num);
    }
}

class CountNum{
    int num;
    int count;
}

 

 

  • 求职意向
  • 面试了几家公司
  • 目前薪资和期望薪资
  • 对公司的了解
  • 面试官介绍公司和团队
  • 等hr通知

 

 

一些问题巩固于复习:

 

【重写规则】

  • 参数列表必须完全与被重写方法的相同。
  • 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。    这个犹豫了会,因为平时重写的话返回类型都和父类保持相同
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
  • 父类的成员方法只能被它的子类重写。
  • 声明为 final 的方法不能被重写。
  • 声明为 static 的方法不能被重写,但是能够被再次声明。
  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
  • 构造方法不能被重写。

 

 

【重载规则】

  • 被重载的方法必须改变参数列表(参数个数或类型不一样);
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。
  • 无法以返回值类型作为重载函数的区分标准

 

 

B+ 树好在哪里?

一来B+树矮胖,遍历层数低

这一块面试答得不大好

 

可参考  https://blog.csdn.net/yangguosb/article/details/81903583

在B+树中, 由于底层的各个叶子节点都通过指针组织成一个双向链表。 只需要从根节点到叶子节点定位到第一个满足条件的Key, 然后不断在叶子节点迭代next指针即可实现遍历,此时相当于顺序IO。

 

 

叶子节点包含数据

 

 

Kafka为什么是高性能,高吞吐的?

1)取决于kafka的顺序写(Kafka可以每秒600M顺序读写 ),顺序写速读比随机写速度高很多

2)批量发送,在异步发送模式中。kafka允许进行批量发送,也就是先将消息缓存到内存中,然后一次请求批量发送出去。这样减少了磁盘频繁io以及网络 IO造成的性能瓶颈

3)零拷贝。消息从发送到落地保存,broker维护的消息日志本身就是文件目录,每个文件都是二进制保存,生产者和消费者使用相同的格式来处理。在消费者获取消息时,服务器先从硬盘读取数据到内存,然后把内存中的数据原封不懂的通过socket发送给消费者。虽然这个操作描述起来很简单,但实际上经历了很多步骤

 

 

 

 

 

 

 

转载请注明:汪明鑫的个人博客 » 跟谁学 视频二面

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz