百度超详细面经(附答案)

2023-11-03

点击上方蓝字关注我们吧~

百度

一面

  1. 上来照例还是问了问项目。

    答:我介绍了自己的项目背景,项目的整个流程,由于是一个多人合作的项目,还介绍了自己负责项目的哪个模块,以及这个模块如何实现的,我感觉我个人说话语速比较快,建议大家尽量语速慢一些,可以多说个几分钟~

  2. 项目亮点

    可以作为你面试的项目亮点的文章,不来看看吗?

  3. 然后他就说那就来问一下基础的java问题吧,问了java的8种基本数据类型

    答:byte short int long float double boolean char

  4. 字符集和编码的区别?

    答:字符集是多个字符的集合,比如说ASC码就说字符集;编码的话就是计算机底层是01这样存储每个字符,编码就是按照一定的规则(比如说多长一串二进制)去读取二进制数的规则;

  5. 说的数据类型,然后问了我short s1 = 1; s1 = s1+1;对不对?

    答:我说不对,s1+1发生强制类型转换变成了int类型,应该是这样s1=short(s1+1);我顺带说了s1++就行,编译器自动进行特殊处理

  6. Final修饰词作用?

    答:final修饰变量如果修饰的是基本数据类型,那么这个值一经赋值那么无法改变,如果修饰的是引用数据类型,那么引用不可以改变,但是引用中的对象内容是可以变化的;final修饰的方法不可以被子类修改,修饰的类不可被继承;

  7. 接着问了final修饰有啥好处?

    答:final的关键字提高了性能,JVM和java应用会缓存final变量;final变量可以在多线程环境下保持线程安全;使用final关键字,JVM会对方法变量类进行优化;

  8. 还问了String中重写equals不重写hashcode会出现什么问题?

    答:这个我说了集合类中中hashset,存储着某一个对象,如果重写了对象的equals方法,但是没有重写hashcode方法,那么hashset中可能存储两个hashcode值相同也就是两个相同的对象,这样会破坏了hashset存储对象的唯一性。

  9. 由于我上面提到了集合,然后问我让我讲一讲hashmap。

    答:hashmap我讲了hashmap的数据结构数组链表结构,讲了hashmap的put,get,扩容的底层原理,讲了hashmap不是线程安全的,以及它为什么不是线程安全,举了在多线程下插入,扩容带来的非线程安全的例子;同时讲了hashmap在1.7与1.8中的区别,put中引入了红黑树,以及扩容的时候不同,这些就讲了挺长时间;

  10. 由于我上面提到了hashmap非线程安全,就问了我ConCurrentHashmap

    答:这个我又讲了很长时间,讲了ConCurrentHashMap的底层的分段锁的结构,讲了ConCurrentHashmap的get源码,get源码是没有使用锁的,这里我把get源码背写了下来,并给面试官讲了get源码在插入修改删除的多线程下是安全的;然后讲了put操作,remove,扩容操作,然后讲了在1.7和1.8的区别,引入了红黑树,链表长度大于8转换成红黑树,采用了CAS+synchronized来保证并发安全,吧啦吧啦又讲了挺长时间;

  11. 这里由于我讲到了resize这个过程,然后面试官问了我,扩容的过程中,会产生一个新的数组,那么这时候正在扩容的时候插入的新的节点是插入到旧的数组,还是插入到新的数组?

    答:这里的话,插入新的键值对是会被插入到新的哈西边中,在扩容的时候有两个哈希表,一个旧表,一个新表,会把旧表中的内容全部复制到新表,然后再把旧表删除,新数据来了就插入新的表中。

  12. 问了LinkedList适合用什么排序?

    答:归并排序

  13. 问了我对于try里面的数据库断开连接操作,为了保证连接断开,继续在finally中执行断开连接操作,如果finally中继续抛出异常,怎么能确保数据库连接断开?

    答:这个问题我不是很会,下来百度了也没找到,这个我当时回答的是继续在finally中进行try catch包裹进行断开连操作,如果有知道的,欢迎评论区留言。

  14. 上述问题问完我之后,考了一道手写代码题,就是找二叉树的最小深度。

    答:这个题是有坑的,具体坑是什么见我的这篇文章。

二面

  1. 照例是讲了讲我的项目,以及项目亮点;

  2. 我项目中有爬虫,然后就问我在爬虫过程中遇到了什么问题?

    答:这个我有准备过,虽然这些问题我自己并没有遇见,哈哈~

    (1)说了遇到登录问题,需要登录的,然后我说一种解决方法是使用谷歌浏览器检查然后先登录,然后观察传输的数据包,然后构造这些传输的数据包;另一种解决方法是使用webdriver+phantomjs去模拟浏览器的操作,完全模拟像人一样的操作;(2) 遇到需要动态加载的问题,一种是观察js请求,模拟这个js请求过程,另一种解决方法就是就是webdriver+phantomjs;(3)基于用户行为,当一个ip短期内大量访问,会限制这个ip,这个时候才有代理池,如果这个ip无法访问,那么就切换一个ip;

  3. 他接着扣了我的爬虫项目,问我,如果对于大量的url你是如何确定这个url爬没爬过?

    答:这个问题我之前没有遇到过,想了10多秒,然后我说采用bitmap,对于每个url求其hash值,存到bitmap里面,然后初始值都赋值成0,当这个url爬取过了以后,就把对对应的位置位1。他听了之后,觉得还行,就没有深究;

  4. 然后问我你的爬虫内容是如何去重的,就是比如说鹿晗宣布自己有女票了,这个时候有好几篇新闻文章都报道了这个新闻,他们的新闻的内容大体意思是一样的,这样的怎么去重?

    答:这个我也没遇到过,我临时想了一个方法,我说可以去对这篇文章去分词,然后统计词频,如果两篇文章的词频前几个一样,那么把这两篇文章看做一个;他听了以后,觉得还行,没在继续问;

  5. 然后问了我,对于爬取的url怎么设置优先级,如何保证早上的新闻比晚上的新闻先爬取?

    答:这个我答了一个添加时间戳,根据时间戳来进行爬取,然后他就没继续问了。

  6. 这些问完以后,然后问了一个手写代码题,剑指offer的原题。判断一个数组是不是二叉树的后序遍历序列,大体思路就是每次都去找到左子树的结尾的下标与右子树开头的下标,看看有没有越界,递归就完事。

     1public class Solution {
     2    public boolean VerifySquenceOfBST(int [] sequence) {
     3        if(sequence.length == 0)
     4            return false;
     5        return verify(sequence,0,sequence.length-1);
     6    }
     7    public boolean verify(int [] sequence,int begin,int end)
     8    {
     9        if(begin == end)
    10            return true;
    11        int rootValue = sequence[end];
    12        int leftBegin = -1;
    13        int leftEnd = -1;
    14        int rightBegin = -1;
    15        int rightEnd = -1;
    16        for(int i=begin;i<end;i++)
    17        {
    18            if(sequence[begin] < rootValue)
    19                leftBegin = begin;
    20            if(sequence[i] < rootValue)
    21                leftEnd = i;
    22            else{
    23                if(rightBegin == -1)
    24                    rightBegin = i;
    25                rightEnd = i;
    26            }
    27        }
    28        if(rightBegin < leftEnd && rightBegin != -1)
    29            return false;
    30        return verify(sequence,leftBegin,leftEnd) && verify(sequence,rightBegin,rightEnd);
    31    }
    32}
    

  7. 然后问了我一个多线程的问题,就是10个线程执行,然后主线程必须等10个线程都执行完了,然后获取到10个线程的计算结果,然后才能计算出自己的结果,也就是说必须等待10个线程都执行完了,我才执行,如何做?

    答:我说了Thread.join(),等待执行;然后就是callable 与FutureTask结合执行,通过FutureTask去获取线程的执行状态,写一个while循环一直去查询;另一种我说了使用CountDownLatch;

  8. 然后让我说一下,如何设计一个LRU,用什么数据结构,以及set,get的O(1)的时间复杂度如何实现,大体写一下伪代码。

    答:这个我之前准备过,大体思路就是采用双向链表+HashMap。

    1HashMap<Integer, Node> map = new HashMap<Integer, Node>();
    

    这个是数据存储Node节点示意:

     1class Node {
     2    int key;
     3    int value;
     4    Node pre;
     5    Node next;
     6
     7    public Node(int key, int value) {
     8        this.key = key;
     9        this.value = value;
    10    }
    11
    12    @Override
    13    public String toString() {
    14        return this.key + "-" + this.value + " ";
    15    }
    16
    

    可以看到Node节点中有一个key,通过这个key去找这个Node节点。这是是get操作,

     1   public int get(int key) {
     2        if (map.containsKey(key)) {
     3            Node n = map.get(key);
     4            remove(n);
     5            setHead(n);
     6            printNodes("get");
     7            return n.value;
     8        }
     9        printNodes("get");
    10        return -1;
    11    }
    

    由于当一个节点通过key来访问到这个节点,那么这个节点就是刚被访问了,就把这个节点删除掉,然后放到队列头,这样队列的头部都是最近访问的,队列尾部是最近没有被访问的。然后接下来是set操作,

     1    public void set(int key, int value) {
     2        if (map.containsKey(key)) {
     3            Node old = map.get(key);
     4            old.value = value;
     5            remove(old);
     6            setHead(old);
     7        } else {
     8            Node created = new Node(key, value);
     9            if (map.size() >= capacity) {
    10                map.remove(end.key);
    11                remove(end);
    12                setHead(created);
    13
    14            } else {
    15                setHead(created);
    16            }
    17
    18            map.put(key, created);
    19        }
    20        printNodes("set");
    21    }
    

    由于set操作是找到这个键值对,然后修改value的值,由于这个节点被访问了,所以删除他,把这个节点放到头部,如果这个节点不存在,那么就新建一个节点,把这个节点放到头部,同时map增加这个键值对。上述中所有过程都是先访问map,由于hashmap是O(1)的时间复杂度,而且双向链表的所有操作的时间复杂度在本例中都是O(1),删除啦,插入头部都是O(1)时间复杂度,所以整个get和set的时间复杂度都是O(1)。

三面

  1. 三面也是上来聊了聊项目以及项目亮点;

  2. 然后就出了一道场景图,就是对于一个上线的系统,它会周期性地出现卡顿,这是怎么回事,让我分析原因.

    答,我的项目亮点就是来源于百度的这道面试题,具体我的回答,见这篇文章。可以作为你面试的项目亮点的文章,不来看看吗?

  3. 然后问完这些,就开始聊人生聊理想了,问我喜欢什么方向java后台还是大数据,我说喜欢大数据,但是我没准备任何与大数据相关的知识,准备结束秋招学习一波,然后他听到这里给我出了一道大数据的题目,额,我真是自己找事。。。题目是这样子的,就是10亿数据找topN的问题?

    答:我就是用答这类题的套路,详情参见这个文章https://blog.csdn.net/WantFlyDaCheng/article/details/81531994   就是分而治之,然后hashmap统计,然后求建立一个大小为N的最小堆,然后求分开的每一个部分的topN,然后再把每个部分进行两两合并。

  4. 然后由于我说的是两两合并,他问如何能快一些;

    答,我答了可以一起进行多个进行合并,快一些。

  5. 这些结束完成以后,问我有啥想问的?

    答:我说,您现在是一个技术leader了,想知道,以后如何能成为向您一样厉害的人,以后的职场规划该怎么样规划,吹捧一波。他说就是你在百度的话就是要敢想敢做,不要畏畏缩缩的,大体就是这意思,然后就完事了。

hr面

百度的hr面感觉就是走个过场。。。

结束语

百度的面试环境不错,一对一在酒店的房间面试,百度是我第一家被女面试官面试的公司,然后总体感觉百度面试官问完一个东西,喜欢揪着你问为啥是这样的,比如说前面的final关键字以及我讲完hashmap扩容以后问我正在扩容的时候来了一个怎么插入,所以感觉要想通过面试,有些东西自己得去深究,自己给自己想问题,为啥是这样子的,我的感想就是这么多,希望对大家有帮助。辣条~

END

目前准备每天刷一道leetcode,准备建立一个leetcode刷题讨论群,有兴趣的朋友欢迎加入,如果人数超过100,请加我的个人微信,备注leetcode~

微信群

640?wx_fmt=jpeg

个人微信

640?wx_fmt=jpeg

END

扫一扫

640?wx_fmt=png

有3T编程资料等你来拿

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

百度超详细面经(附答案) 的相关文章

  • 数据结构之图:无向图的介绍与功能实现,Python——22

    无向图 Undigraph 的介绍 引入 生活中的图 有地图 集成电路板的图 可以看类似的看做是数据结构中的图 数据有 一对一 一对多 和 多对多 的关系 前两种分别表示线性表和树的存储结构性质 而多对多则可表示图的存储结构性质 定义 图是
  • 基于Jupyter(python)使用蒙特·卡罗方法计算圆周率近似值

    使用蒙特 卡罗方法计算圆周率近似值 from random import random times int input 请输入掷飞镖次数 hits 0 for i in range times x random y random if x
  • 操作系统日志收集与分析

    一 Windows日志收集与分析 在运维工作中 如若windows服务器被入侵 往往需要检索和分析相应的安全日志 除了安全设备 系统自带的日志就是取证的关键材料 但是此类日志数量庞大 需要高效分析windows安全日志 提取出我们想要的有用
  • 电源纹波测试,居然还能这么玩

    开关稳压器因其具有非常高的效率优势 正在各个领域逐渐替代线性稳压器 但由于开关稳压器通常被认为具有很大的输出纹波 Ripple 所以很多工程师在高性能和噪声敏感型系统中只考虑使用低压差 LDO 稳压器 而事实上 现今很多高性能开关稳压器都已
  • 迁移学习概述

    1 迁移学习的背景 在有监督的机器学习和尤其是深度学习的场景应用中 需要大量的标注数据 标注数据是一项枯燥无味且花费巨大的任务 关键是现实场景中 往往无法标注足够的数据 而且模型的训练是极其耗时的 因此迁移学习营运而生 传统机器学习 主要指
  • markdown语法介绍

    目录 动态目录 toc 文章目录 目录 一 标题和文本 1 使用 和 标记一级和二级标题 2 使用 号标记 3 换行 二 文字标记和插入图片 链接 1 插入链接 2 插入图片 3 文字标记 设置文字 删除线 下划线 上标 下标 注释 4 e
  • Flip card 卡片翻转效果

    鼠标滑过 卡片翻转 如果想要点击卡片翻转的话就把 hover 改成 hover 然后自己添加点击事件 添加 class hover
  • Java序列化

    Java序列化 原理图 0bjectoutputstream java io 0bjectoutputstream extends outputstreamobjectoutputstream 对象的序列化流 作用 把对象以流的方式写入到文
  • 以太坊合并后,Layer2 何去何从?

    转载原文链接 http www btcwbo com 5671 html 在2022年以太坊开发者峰会上 联合创始人威尔基说 以太坊预计将信号标准链与主网络合并 通过8月份的TheMerge 合并 升级 这样以太坊就可以证明 POS 共识算
  • 英雄联盟-经验砖块

    作为一个LOL老玩家 如果说对游戏细节把握不到位 这是说不过去的 我们时常说道发育为重 那么发育包括等级和装备 我们是不是应该更精细的把我等级呢 今天我们来探究一下 赖线从小兵身上我们能获得多少经验等级 问题1 每个小兵有多少经验值呢 近战
  • 勒索软件攻击防护中的6个常见错误

    勒索软件攻击已经成为影响所有行业和组织的大问题 考虑到这些攻击可能对企业造成的影响 安全专业人员正在尝试以各种方式保护企业的网络 应用和数据 然而 但随着勒索攻击威胁形势的不断变化 很多错误的做法可能会阻碍企业勒索防护计划的有效执行 并使组
  • 最详细的Transformer讲解,Attention Is All You Need

    前言 Attention Is All You Need Google Brain 引用量 30255 1 3 ResNet 贡献 Transformer 是第一个完全依赖自注意力来计算其输入和输出表示而不是使用序列对齐的RNN和CNN 一
  • C++标准库头文件(工具库->csetjmp)

    参考网址 https zh cppreference com w cpp header https www runoob com cplusplus cpp standard library html 工具库 csetjmp 保存执行语境的
  • Android-Fragment详解

    Fragment是Android最常使用的控件之一 一般情况下 我们会在首页使用到 有的小伙伴也会单Activity和多Fragment的App 我总结了一下我了解的Fragment知识 希望对看这篇文章的小伙伴有所帮助 Fragment的
  • USB:Type-A、Type-B、Type-C、miniUSB、microUSB接口类型区分

    通用串行总线 universal serial bus USB 自推出以来 成功替代串口和并口 已经成为计算机和各种设备不可或缺的接口 USB的优点不用多说 网上有很多 今天主要小结一下USB的各种接口类型 避免被各种各样的USB名字搞晕
  • SQL调优案例1

    SQL语句的执行顺序 1 LIMIT 语句 分页查询是最常用的场景之一 但也通常也是最容易出问题的地方 比如对于下面简单的语句 一般 DBA 想到的办法是在 type name create time 字段上加组合索引 这样条件排序都能有效
  • 遥感影像识别-利用较大数据集训练

    回顾 经过前两次的思考 最终还是回到最初的想法上来 利用大量比较合理的电子地图进行模型的训练 看能否产生较好的效果 前两次的博文链接如下 遥感影像识别 制作数据集 遥感影像识别 训练策略 本次训练所使用的数据集 地域覆盖了全国几个主要的城市
  • Elasticsearch入门笔记

    ES入门笔记 1 概述 1 1 什么是全文检索 1 2 es的应用场景 1 3 参考资料 2 核心概念 3 进阶 3 1 集群 3 1 1 单节点 3 1 2 双节点 故障转移 3 1 3 三节点 水平扩容 3 1 4 应对故障 3 2 路
  • jdk1.8 Lambda 实战

    我们用常用的实例来感受 Lambda 带来的便利 替代匿名内部类 过去给方法传动态参数的唯一方法是使用内部类 比如 1 Runnable 接口 new Thread new Runnable Override public void run
  • 【HJ40】统计字符

    题目描述 输入一行字符 分别统计出包含英文字母 空格 数字和其它字符的个数 本题包含多组输入 数据范围 输入的字符串长度满足 1 1000 输入描述 输入一行字符串 可以有空格 输出描述 统计其中英文字符 空格字符 数字字符 其他字符的个数

随机推荐

  • CSS字体

    CSS字体属性定义文本中的字体 指定字体 font family属性 指定在文本中使用的字体系列 如 body font family sans serif 从sans serif字体系列中选择一个字体 并将其应用到body元素中 CSS字
  • 关于idea中提交svn时一直显示performing VCS refresh

    vue前端项目会自动生成node modules文件夹 在首次上传版本到svn的时候 不要提交node modules文件夹 否则node modules文件也会在版本控制中 那么在npm install之后 灾难就来了 Version C
  • 21年新版kali安装

    第一步 官网下载kali系统镜像文件 官网地址 www kali org 访问kali官网 点击上方GET KALI 然后点击Bare Metal 旁边的Virtual Machines是专门为虚拟机设计的 相比更为轻量 安装过程也比较简单
  • 配置Dot1q终结子接口实现跨设备VLAN间通信示例

    示例图 一 实验目的 1 配置Dot1q终结子接口实现跨设备VLAN间通信示例 二 注意事项 1 Dot1q终结子接口和QinQ终结子接口不支持透传不带VLAN Tag的报文 收到不带VLAN Tag的报文会直接丢弃 2 由于三层以太网子接
  • 前端传输数组条件查询,myslq使用in

    mysql语句使用in条件查询 从前端获取数组 1 post请求体中的json对象 Data public class UserSearchParam String userName NotNull Integer pageNum NotN
  • maomi

    我到家啦 你今天怎么样 需要我帮忙查资料么 转载于 https www cnblogs com loverain archive 2009 07 02 1515416 html
  • 每日一题:7. 分糖果(C++)

    每日一题 7 分糖果 C 题目 Alice 有 n 枚糖 其中第 i 枚糖的类型为 candyType i Alice 注意到她的体重正在增长 所以前去拜访了一位医生 医生建议 Alice 要少摄入糖分 只吃掉她所有糖的 n 2 即可 n
  • Spring-Data-JPA +Sharding-jdbc+druid数据库连接池 实现数据库读写分离

    关于Sharding jdbc 简介 定位为轻量级Java框架 在Java的JDBC层提供的额外服务 它使用客户端直连数据库 以jar包形式提供服务 无需额外部署和依赖 可理解为增强版的JDBC驱动 完全兼容JDBC和各种ORM框架 适用于
  • JDBC之多种开源数据库连接池介绍

    目录 一 多种开源的数据库连接池 二 C3P0数据库连接池 三 DBCP数据库连接池 四 Druid 德鲁伊 数据库连接池 一 多种开源的数据库连接池 1 JDBC 的数据库连接池使用 javax sql DataSource 来表示 Da
  • Element-ui 使用详细介绍

    一 后台搭建 使用 vue admin template 来快速搭建后台管理 它包含了 Element UI axios iconfont permission control lint 这些搭建后台必要的东西 Element是 饿了么团队
  • 六、Docker安装微服务

    一 编译所有的所需jar包 二 上传到服务器 三 编写Docerfile FROM java 8 ADD registry center 1 0 SNAPSHOT jar registry center 1 0 SNAPSHOT jar E
  • js将数组中,每个元素中的逗号分隔的前两位相同的,第三位拼接到一起

    js重新组合数组中的元素 过程可能复杂了 尽力了 谁有简单的留言一下 互相交流学习一下 感谢 var arr 1 20 103 1 28 66 1 20 456 1 21 22 1 21 13 1 20 23 1 21 55 var cou
  • 从零搭建antv数据可视化大屏(轻量级vite-react-ts)

    摘 要 之前Ofter详细介绍过用Vue从零开始编写可视化大屏 今天我们来介绍下如何用React编写可视化图表 为什么我们还要学习React 因为轻量化 像antv可视化图表就全部用的React语言 虽然ant也出了个viser 支持Rea
  • Chrome 网页翻译扩展推荐

    1 沉浸式翻译 网页双语翻译扩展 免费使用 支持 Deepl Google 腾讯 火山翻译等多个翻译服务 支持 Firefox Chrome 油猴脚本 亦可在 iOS Safari 上使用 官网地址 Chrome 网页翻译扩展推荐 2 划词
  • 查找窗口句柄

    HWND SearchWindow CString strWinName 获得桌面窗口 CWnd pDesktopWnd CWnd GetDesktopWindow 获得第一个子窗口 CWnd pWnd pDesktopWnd gt Get
  • strong man

    1 执行力强 注意力放在面对问题 解决问题而不是抱怨上 2 有利他性 看白身的格局 有大局观 会从更高的维度去思考 有更大的责任感3 从容淡定 有足够的自信 对自己的信任和信念 不需要用力过猛 疲于奔命 4 内在自治 跟自己相处和谐 不自我
  • I like play indoor bicycle trainer

    Kurt kinetic road bicycle training machine is a bicycle trainer I bought for me This is a superb quality very silent and
  • 二进制的神奇应用

    谜题 这是一个在坐标轴上玩的 关于 坐标集合 a1 a2 am b1 b2 bl 的游戏 首先 Bob分别在坐标a1 a2 am放上一个球 接下来Bob分别在坐标b1 0 5 b2 0 5 bl 0 5挖了一个洞 最后Bib会将所有球往前推
  • Python 进阶(五):数据库操作之 SQLite

    1 简介 SQLite 是一种嵌入式关系型数据库 其本质就是一个文件 它占用资源低 处理速度快 跨平台 可与 Python Java 等多种编程语言结合使用 SQLite 是一个进程内的库 可以自给自足 无服务器 无需配置 支持事务 Pyt
  • 百度超详细面经(附答案)

    点击上方蓝字关注我们吧 百度 一面 上来照例还是问了问项目 答 我介绍了自己的项目背景 项目的整个流程 由于是一个多人合作的项目 还介绍了自己负责项目的哪个模块 以及这个模块如何实现的 我感觉我个人说话语速比较快 建议大家尽量语速慢一些 可