在线教育公司,目前排前三名应该就是好未来,跟谁学,猿辅导
面了一个半小时,面试官也很认真
比较重基础和算法吧
面试中还聊到百度的文化,曾经互联网中的黄埔军校!
- 自我介绍
- 项目介绍
- 重载和重写
- 重载和重写的返回值有没有限制
- 垃圾回收算法
- 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发送给消费者。虽然这个操作描述起来很简单,但实际上经历了很多步骤
说点什么
您将是第一位评论人!