1.序
马上春招了,分享一波干货。腾讯、百度、阿里、京东、快手、斗鱼、华为、海康威视等面试过程。昨天分享了腾讯,今天来看看百度。
在面试之前给大家看看我的简历以及个人简介部分,因为面试过程与自己的简历有很大关系。面试官往往会结合简历以及个人简介来问。
<mark>个人简历+项目介绍+简历模板</mark>:梦想成真-----项目自我介绍
<mark>个人简介+自我介绍(视频讲解)</mark>:一字一句教你面试“个人简介”
2.百度面试过程
2.1百度1面 (部门:AI指南平台安卓开发、时间:70分钟)
1 单例模式 (解释)
【offerMe–设计模式必备】—单例模式
2 Volatile
https://blog.csdn.net/weixin_41563161/article/details/103869694
https://blog.csdn.net/weixin_41563161/article/details/103869694(lock,sychronized,volatile的区别)
https://blog.csdn.net/weixin_41563161/article/details/102723400(多线程知识点)
3 synchronized
synchronized英[ˈsɪŋkrənaɪzd] 同步代码块的语义底层是基于对象内部的监视器锁(monitor),分别是使用 monitorenter 和 monitorexit 指令完成。其实 wait/notify 也依赖于 monitor 对象,所以其一般要在 synchronized 同步的方法或代码块内使用。monitorenter 指令在编译为字节码后插入到同步代码块的开始位置,monitorexit 指令在编译为字节码后插入到方法结束处和异常处。JVM 要保证每个 monitorenter 必须有对应的 moniorexit。
cas
那个里面的锁能不能用this替代 (类锁和对象锁区别)
/** * 静态内部类,使用双重校验锁,线程安全【推荐】 */
public static class Singleton7 {
private volatile static Singleton7 instance = null;
private Singleton7() {
}
public static Singleton7 getInstance() {
if (instance == null) {
synchronized (Singleton7.class) {
if (instance == null) {
instance = new Singleton7();
}
}
}
return instance;
}
}
4 lock
https://blog.csdn.net/weixin_41563161/article/details/103869694(lock ,sychronized,volatile的区别)
5 aqs
https://blog.csdn.net/weixin_41563161/article/details/104671717
6 线程池以及调优
https://blog.csdn.net/weixin_41563161/article/details/105304160(Java线程池实现原理—美团技术栈)
https://blog.csdn.net/weixin_41563161/article/details/103666165(线程池)
https://blog.csdn.net/weixin_41563161/article/details/105167708(线程池详解)
https://blog.csdn.net/weixin_41563161/article/details/104889470(线程池关闭以及状态)
7 4种线程池以及为什么不建议用
上述
8 快排
【offerMe–数据结构】----排序算法
9 根据先序中序求后序
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre == null || in == null){
return null;
}
return helper(pre,in,0,0,pre.length-1);
}
public TreeNode helper(int [] pre,int [] in,int preStart,int inStart,int inEnd){
if(inStart > inEnd){
return null;
}
int temp = pre[preStart];
TreeNode root = new TreeNode(temp);
int index =0;
for(int i =inStart;i<=inEnd;i++){
if(in[i] == temp){
index = i;
break;
}
}
TreeNode leftNode = helper(pre,in,preStart+1,inStart,index-1);
TreeNode rightNode = helper(pre,in,preStart+index+1-inStart,index+1,inEnd);
root.left = leftNode;
root.right = rightNode;
return root;
}
10数据库整个索引
https://blog.csdn.net/weixin_41563161/article/details/102610132(B树 B+树 红黑树详解)
https://blog.csdn.net/weixin_41563161/article/details/104163948(b树和b+树的区别)
https://blog.csdn.net/weixin_41563161/article/details/105483950(B+树分裂)
https://blog.csdn.net/weixin_41563161/article/details/105165346(索引)
https://blog.csdn.net/weixin_41563161/article/details/103553313(数据库索引怎么实现的)
https://blog.csdn.net/weixin_41563161/article/details/102859171(普通索引和唯一索引,应该怎么选择?)
https://blog.csdn.net/weixin_41563161/article/details/102457643(深入浅出索引)
11虚拟机整个GC以及GC回收器有哪些
https://blog.csdn.net/weixin_41563161/article/details/103882414(G1和CMS区别)
https://blog.csdn.net/weixin_41563161/article/details/103865628(分代回收算法)
https://blog.csdn.net/weixin_41563161/article/details/104093660(GC回收机制(垃圾回收器经典算法)(JVM中内存区域的划分)(GC收集器有哪些))
看jvm书籍
点击 你们要的免费书来了 获取jvm书
12mvcc
https://blog.csdn.net/weixin_41563161/article/details/104871827(binlog redolog MVCC)
https://blog.csdn.net/weixin_41563161/article/details/105763848(MVCC的实现)
https://blog.csdn.net/weixin_41563161/article/details/105722700(Innodb中的事务隔离级别和锁以及MVCC之间的关系)
13 jvm内存结构
JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,它是整个 java实现跨平台的最核心的部分,所有的 java 程序会首先被编译为.class 的类文件,这种类文件可以在虚拟机上执行,也就是说 class 并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。JVM 是 Java 平台的基础,和实际的机器一样,它也有自己的指令集,并且在运行时操作不同的内存区域。JVM 通过抽象操作系统和 CPU 结构,提供了一种与平台无关的代码执行方法,即与特殊的实现方法、主机硬件、主机操作系统无关。JVM 的主要工作是解释自己的指令集(即字节码)到 CPU 的指令集或对应的系统调用,保护用户免被恶意程序骚扰。JVM 对上层的 Java 源文件是不关心的
结构和操作系统有关,是运行 Java 程序必不可少的(除非用其他一些编译环境编译成.exe 可执行文件……),JRE 的地位就象一台 PC 机一样,我们写好的 Win32 应用程序需要操作系统帮我们运行,同样的,我们编写的 Java程序也必须要 JRE 才能运行。
JVM是java字节码执行的引擎,还能优化java字节码,使之转化成效率更高的机器指令。
JVM中类的装载是由类加载器和它的子类来实现的,类加载是java运行时一个重要的系统组件,负责在运行时查找和装入类文件的类。
不同的平台对应着不同的JVM,在执行字节码(class文件)时,JVM负责将每一条要执行的字节码送给解释器,解释器再将其翻译成特定平台换将的机器指令并执行,这样就实现了跨平台运行。
内存区域
1,程序计数器
程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前线程的行号指示器。它是线程私有(一个线程就有一个程序计数器)的。
2,虚拟机栈
一个线程的每个方法在执行的同时,都会创建一个栈帧(Statck Frame),栈帧中存储的有局部变量表、操作站、动态链接、方法出口等,当方法被调用时,栈帧在JVM栈中入栈,当方法执行完成时,栈帧出栈。
每个线程对应着一个虚拟机栈,因此虚拟机栈也是线程私有的。
栈:主要用于存储局部变量和对象的引用变量,每个线程都会有一个独立的栈空间,所以线程之间是不共享数据的。
3,本地方法栈
本地方法栈在作用,运行机制,异常类型等方面都与虚拟机栈相同,唯一的区别是:虚拟机栈是执行Java方法的,而本地方法栈是用来执行native方法的,
4,堆区
堆内存主要作用是存放运行时创建(new)的对象。
(主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确定)
堆:主要用于存储实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是可以共享数据的。
5,方法区
方法区是各个线程共享的区域,用于存储已经被虚拟机加载的类信息(即加载类时需要加载的信息,包括版本、field、方法、接口等信息)、final常量、静态变量、编译器即时编译的代码等。
8struct 和 c++的类怎么区分
C/C++结构体的区别
C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数。
结构体定义中默认情况下的成员是public,而类定义中的默认情况下的成员是private的。类中的非static成员函数有this指针,(而struct中没有是错误的,一直被误导啊,经过测试struct的成员函数一样具有this指针),类的关键字class能作为template模板的关键字 即template class A{}; 而struct不可以。
C的结构体只是把数据变量给包裹起来了,并不涉及算法。
而C++是把数据变量及对这些数据变量的相关算法给封装起来,并且给对这些数据和类不同的访问权限。
C语言中是没有类的概念的,但是C语言可以通过结构体内创建函数指针实现面向对象思想。
14 java内存模型
https://blog.csdn.net/weixin_41563161/article/details/105316381
15 B+树的分页过程
https://blog.csdn.net/weixin_41563161/article/details/105483950
16 CAS
https://blog.csdn.net/weixin_41563161/article/details/104786539
2.2 百度2面(50分钟)
1 3个项目讲一下
个人简历:梦想成真-----项目自我介绍
2 红黑树
3 左旋右旋
规则1:节点是红色或黑色的;
规则2:根节点是黑色的;
规则3:每个叶子节点都是黑色的空节点(NIL节点);
规则4:每个红色节点的两个子节点都是黑色的(从每个叶子到根的所有路径上不可能有两个连续的红色节点);
规则5:从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点;
1 红黑树是牺牲了严格的高度平衡的优越条件为代价,它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。
2红黑树能够以O(log2n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。
3结合TreeMap
TreeMap 实现了 SortMap 接口,其能够根据键排序,默认是按键的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时得到的记录是排过序的,TreeMap 取出来的是排序后的键值
4红黑树占用的内存更小(仅需要为其存在的节点分配内存),而Hash事先应该分配足够的内存存储散列表,即使有些槽可能弃用
https://blog.csdn.net/weixin_41563161/article/details/104986919(TreeMap使用场景 优势)
https://blog.csdn.net/weixin_41563161/article/details/102610132(B树 B+树 红黑树详解)
https://blog.csdn.net/weixin_41563161/article/details/104163948(b树和b+树的区别)
https://blog.csdn.net/weixin_41563161/article/details/104163994(TreeMap了解吗 红黑树)
https://blog.csdn.net/weixin_41563161/article/details/105462349(红黑树叶子节点都为黑色)
https://blog.csdn.net/weixin_41563161/article/details/104452601(java面试 –红黑树(插入删除过程详解))
4集合
https://blog.csdn.net/weixin_41563161/article/details/102506009
5Hashmap的细节(自己复习的不够细)
https://blog.csdn.net/weixin_41563161/article/details/105462699(hashmap中两次hash过程)
https://blog.csdn.net/weixin_41563161/article/details/102659874(java中HashMap原理)
https://blog.csdn.net/weixin_41563161/article/details/105041804(HashMa在JDK1.7版本头插法实现解析)
https://blog.csdn.net/weixin_41563161/article/details/104708231(hashmap底层实现)
https://blog.csdn.net/weixin_41563161/article/details/104190568(HashMap、Hashtable、ConcurrentHashMap的原理与区别)
6 树的深度
public static int maxDepth(TreeNode root) {
if (root == null) {
return 0;
} else {
int left_height = maxDepth(root.left);
int right_height = maxDepth(root.right);
return java.lang.Math.max(left_height, right_height) + 1;
}
7 平衡二叉树
public static boolean isBalanced(TreeNode root) {
if(root == null){
return true;
}
int left = maxDepth(root.left);
int right = maxDepth(root.right);
int diff = left-right;
if(diff >1 || diff<-1){
return false;
}
return isBalanced(root.left) && isBalanced(root.right);
}
public static int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return (left > right) ? (left+1) : (right+1);
}
8旋转数组
给定一个N*N的整形矩阵Matrix,把这个矩阵顺时针旋转90度,输入(打印)元素值。
例如:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
输出结果为:
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
要求:额外空间复杂度为O(1)
*/
public static void main(String[] args) {
//初始化一个 4*4的整形矩阵,从第一行第一列从左向右,第二行,第三行,直到第四行依次赋值 1,2,...16.
int[][] matrixDemo=new int[4][4];
matrixDemo=createMatrix();
printMatrix(matrixDemo);
System.out.println();
//顺时针旋转90度打印
rotate(matrixDemo);
printMatrix(matrixDemo);
}
//顺时针旋转90度打印
private static void rotate(int[][] matrix) {
// TODO Auto-generated method stub
int topRow=0;
int topCol=0;
int dowmRow = matrix.length-1;
int dowmCol = matrix[0].length-1;
while(topRow <= dowmRow) {
rotateEdge(matrix, topRow++, topCol++, dowmRow--,dowmCol--);
}
}
//顺时针旋转90度打印
private static void rotateEdge(int[][] matrix, int topRow, int topCol, int dowmRow, int dowmCol) {
// TODO Auto-generated method stub
int times=dowmRow-topRow;
// timies就是总的组数
int temp=0;
for(int i=0; i!=times;i++) {
//一次循环就是一组调整
temp=matrix[topRow][topCol+i];
matrix[topRow][topCol+i]=matrix[dowmRow-i][topCol];
matrix[dowmRow-i][topCol]=matrix[dowmRow][dowmCol-i];
matrix[dowmRow][dowmCol-i]=matrix[topRow+i][dowmCol];
matrix[topRow+i][dowmCol]=temp;
}
}
//生成矩阵
private static int[][] createMatrix() {
// TODO Auto-generated method stub
int matrix[][]=new int[4][4];
int k=1;
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
matrix[i][j]=k;
k++;
}
}
return matrix;
}
//顺序打印矩阵元素
private static void printMatrix(int[][] matrix) {
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
System.out.print(matrix[i][j]+"\t");
}
System.out.println();
}
}
}
9项目
个人简历:梦想成真-----项目自我介绍
3.百度面试感受
-
百度面试是<mark>打乱面试</mark>,面试官绝大多数不是你的导师或者主管,所以这个时候尽情的展现自己。
-
提前批找自己的师兄师姐帮忙内推,百度会有很多机会,通过牛客啥的反而机会很小。
-
一定要有一个特别<mark>突出的地方</mark>让面试官对你有好印象,比如数据库或者操作系统,你能讲出自己的理解以及底层东西出来。
-
秋招时拿到百度的offer<mark>一定要argue</mark>,hr都很那个。。所以你拿出好多她就会加码,不要随意把自己卖了。
-
<mark>A题一定要A过去</mark>,这就要在之前狠下功夫,如果一开始题就不行后面的面试如果没有特别出彩的话会直接pass。。
本公众号分享自己从程序员小白到经历春招秋招斩获10几个offer的面试笔试经验,其中包括【Java】、【操作系统】、【计算机网络】、【设计模式】、【数据结构与算法】、【大厂面经】、【数据库】期待你加入!!!
1.计算机网络----三次握手四次挥手
2.梦想成真-----项目自我介绍
3.你们要的设计模式来了
4.震惊!来看《这份程序员面试手册》!!!
5.一字一句教你面试“个人简介”
6.接近30场面试分享
7.你们要的免费书来了