1.2024 百度提前批Java面试
一面
1.1 算法题:一个长度为n的数组中找出m个最大的数。
思路:将数组排序,然后创建一个长度为m的数组,将原数组下标n-m-1到n-1的数组复制到长度到m的新数组中。
public class FindMaxM { public static int[] findMaxM(int[] nums, int m){ if (nums == null || nums.length == 1 || m <= 0 || m > nums.length){ return new int[0]; } Arrays.sort(nums); int[] arr = new int[m]; //复制原数组后m个数给新数组 System.arraycopy(nums, nums.length-m, arr, 0, m); return arr; } public static void main(String[] args) { int[] nums = {1, 3, 2, 5, 4}; int[] maxM = findMaxM(nums, 3); for (int val: maxM) { System.out.print(val + " "); } } }长度为n的数组中最大m个数
测试结果:
3 4 5
1.2 说出给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url的思路
该问题设计大数据处理和算法优化知识点。由于内存限制是4G,文件a和b共占用空间超过该限制,因此无法将所有URL加载到内存中比较。为解决该问题,可以使用哈希算法将文件a和b的URL分成多个小文件,再将每个小文件加载到内存中比较。具体流程为:
- 对文件a和b的每个URL计算hashcode,并根据hashcode将URL分配到不同的小文件中;
- 接着将每个小文件加载到内存中,使用hashset或布隆过滤器存储URL,加快查询
- 一旦所有的URL都处理完毕,并存储在数据结构中,可以将文件b逐个加载到内存中,同时对每个URL进行哈希计算,并在数据结构中查询是否存在相同的URL。
- 如果存在相同的URL,即找到共同的URL之一,可以记录下来或进行其他处理。
- 重复执行步骤4,直到文件b中的所有URL都处理完毕,返回最后结果。
1.2.1 布隆过滤器
布隆过滤器(Bloom Filter)是一种空间效率非常高的概率型数据结构,用于判断某个元素是否存在于一个集合中。它通过使用位数组和多个哈希函数来判断元素的存在性,具有高效的插入和查询操作,并且相对于传统的数据结构可以节省大量的内存空间。
原理:
- 初始化时,创建一个位数组,长度为m,并设置所有位的值为0。
- 选择k个独立的哈希函数,每个哈希函数可以将元素映射到位数组中的一个位置。
- 针对要插入的元素,依次使用k个哈希函数计算哈希值,并将对应的位数组位置设置为1。
- 对于查询操作,同样使用k个哈希函数计算待查询元素的哈希值,并检查对应的位数组位置是否全为1。如果有任何一个位数组位置为0,则判定该元素一定不存在;如果所有位数组位置都为1,则判定该元素可能存在。
布隆过滤器的使用场景如下:
唯一性判断:在数据库或缓存中,可以使用布隆过滤器判断某个元素是否已经存在,避免重复插入或查询;
URL去重:对于大规模的URL集合,可以将URL放入布隆过滤器中以过滤重复的URL,减少存储和计算资源的消耗;
黑名单过滤:可以将黑名单中的元素放入布隆过滤器,从而高效地判断某个元素是否在黑名单中;
防止缓存穿透:通过布隆过滤器判断请求的数据是否在缓存中不存在,从而减轻数据库或后端存储的压力。
1.3 布隆过滤器处理缓存穿透问题
缓存穿透:当用户访问数据是,数据既不在缓存中,也不在数据库中。当有大量的用户请求数据时,数据库压力剧增。
发生原因:1)业务误操作导致缓存和数据库中数据全部被删除;2)恶意黑客攻击,大量访问某些读取不到的数据的业务。
解决方案:
- 非法请求限制,在API接口处判断参数合理性,避免访问缓存和数据库;
- 缓存null值或默认值,避免查询数据库;
- 使用布隆过滤器快速判断数据是否存在,避免查询数据库数据是否存在,来应对缓存穿透。
缓存穿透中布隆过滤器的工作原理:
布隆过滤器由「初始值都为 0 的位图数组」和「 N 个哈希函数」两部分组成。当我们在写入数据库数据时,在布隆过滤器里做个标记,这样下次查询数据是否在数据库时,只需要查询布隆过滤器,如果查询到数据没有被标记,说明不在数据库中。
服务器处理并发请求有哪几种方式?(如tomcat,nginx)
了解select,poll,epoll吗
java有一种现代的处理方式,属于异步I/O,是什么
redis,nginx,netty这些超高性能的中间件,是依赖什么做的这么高性能
https是如何防范中间人的攻击
描述一下打开百度首页后发生的网络过程
什么是ddos攻击,怎么防范
进程中通信的方式有哪些
linux中有一个日志文件,日志文件中记录了访问请求的信息,第一列是访问的日期,第二列是请求的ip,第三列是请求的耗时,写一条shell命令来查到请求耗时最高的10条记录
怎么查看哪个端口被哪个进程占用
用shell命令替换一个文件中的字符串
有代码review吗,过程是什么
使用过git吗,在一次commit后,如果想再进行一次commit并且和并之前的commit,一共只产生一条commit,该如何操作
mysql有哪几种存储引擎,它们的区别是什么
mysql的隔离级别分为哪几种类型
慢查询是如何调试解决的
mysql的explain有什么作用
java中有哪些常用的锁,在什么场景下使用
什么是反射,反射在java中有哪些使用场景
开放接口到外网有哪些风险
怎样防止未授权的访问
假如cpu跑到100%,你的解决思路是什么
二面
2.参考面试题目链接
1.2024百度提前批Java面经_牛客网 (nowcoder.com)
什么是缓存雪崩、击穿、穿透? | 小林coding (xiaolincoding.com)
标签:面试题,缓存,哈希,URL,布隆,过滤器,数组,秋招,百度 From: https://www.cnblogs.com/kzf-99/p/17891440.html