2024滴滴校招面试真题汇总及其讲解(四)

14.【分布式】聊聊你理解的CAP,C和A如何取舍?CP和AP有哪些代表性的系统?

CAP 理论是分布式系统设计中的重要理论,它指出在一个分布式系统中,最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

一致性是指系统中的所有数据副本在同一时刻都保持一致。

可用性是指系统始终能够对外提供服务。

分区容错性是指系统在发生网络分区的情况下仍然能够正常运行。

在实际应用中,通常需要根据具体的需求进行取舍。

CP 系统

CP 系统是指满足一致性和分区容错性的系统。CP 系统可以保证数据的一致性,即使发生网络分区,系统仍然能够正常运行。但是,CP 系统在发生网络分区的情况下,可能会出现服务不可用的情况。

CP 系统的代表性系统包括:

  • 数据库:关系型数据库、NoSQL 数据库等。
  • 文件系统:分布式文件系统等。
  • 消息队列:Kafka、RocketMQ 等。

AP 系统

AP 系统是指满足可用性和分区容忍性的系统。AP 系统可以保证系统始终对外提供服务,即使发生网络分区,可能会出现数据不一致的情况。

AP 系统的代表性系统包括:

  • 缓存:Redis、Memcached 等。
  • 搜索引擎:Elasticsearch、Solr 等。
  • 社交网络:Twitter、Facebook 等。

C 和 A 的取舍

在实际应用中,通常需要根据具体的需求进行取舍。

对于对数据一致性要求很高的应用,可以选择 CP 系统。对于对可用性要求很高的应用,可以选择 AP 系统。对于对两者都要求比较高的应用,可以选择 CAP 理论之外的其他方案,例如:

  • 弱一致性:允许数据在不同节点之间存在一定程度的不一致。
  • 最终一致性:允许数据在一定时间内存在不一致,最终会达到一致状态。

总结

CAP 理论是分布式系统设计中的重要理论,它为我们提供了一个基本的参考框架。在实际应用中,应根据具体的需求进行取舍,选择合适的系统。

15.【算法题】增量元素之间的最大差值

给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i] 能求得的 最大差值 ,其中 0 <= i < j < n 且 nums[i] < nums[j] 。

返回 最大差值 。如果不存在满足要求的 i 和 j ,返回 -1 。

示例 1:

输入:nums = [7,1,5,4]

输出:4

解释:

最大差值出现在 i = 1 且 j = 2 时,nums[j] - nums[i] = 5 - 1 = 4 。

注意,尽管 i = 1 且 j = 0 时 ,nums[j] - nums[i] = 7 - 1 = 6 > 4 ,但 i > j 不满足题面要求,所以 6 不是有效的答案。

示例 2:

输入:nums = [9,4,3,2]

输出:-1

解释:

不存在同时满足 i < j 和 nums[i] < nums[j] 这两个条件的 i, j 组合。

示例 3:

输入:nums = [1,5,2,10]

输出:9

解释:

最大差值出现在 i = 0 且 j = 3 时,nums[j] - nums[i] = 10 - 1 = 9 。

解答:

增量元素之间的最大差值是指,给定一个下标从 0 开始的整数数组 nums,该数组的大小为 n,请计算 nums[j] - nums[i] 能求得的最大差值,其中 0 <= i < j < n 且 nums[i] < nums[j]。

暴力法

暴力法是直接遍历所有 i 和 j,计算 nums[j] - nums[i],找出最大的值。暴力法的算法如下:

public int maximumDifference(int[] nums) {
  int n = nums.length;
  int max = Integer.MIN_VALUE;
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      if (nums[j] - nums[i] > max) {
        max = nums[j] - nums[i];
      }
    }
  }
  return max;
}

暴力法的时间复杂度是 O(n^2),空间复杂度是 O(1)。

优化

可以通过记录之前的最小值来优化暴力法。优化后的算法如下:

public int maximumDifference(int[] nums) {
  int n = nums.length;
  int max = Integer.MIN_VALUE;
  int min = nums[0];
  for (int i = 1; i < n; i++) {
    min = Math.min(min, nums[i]);
    if (nums[i] - min > max) {
      max = nums[i] - min;
    }
  }
  return max;
}

优化后的算法的时间复杂度是 O(n),空间复杂度是 O(1)。

Java 实现

public class MaximumDifference {

  public static int maximumDifference(int[] nums) {
    int n = nums.length;
    int max = Integer.MIN_VALUE;
    int min = nums[0];
    for (int i = 1; i < n; i++) {
      min = Math.min(min, nums[i]);
      if (nums[i] - min > max) {
        max = nums[i] - min;
      }
    }
    return max;
  }

  public static void main(String[] args) {
    int[] nums = {1, 9, 2, 8, 3, 7, 4, 6, 5};
    System.out.println(maximumDifference(nums)); // 7
  }
}

复杂度分析

暴力法的时间复杂度是 O(n^2),因为需要遍历所有 i 和 j。优化后的算法的时间复杂度是 O(n),因为只需要遍历一次数组。两种算法的空间复杂度都是 O(1)。

16.【设计模式】代理模式有哪几种,几种工厂模式间的关系;

代理模式分为以下几种:

静态代理:代理对象和被代理对象是静态绑定的,在编译时就确定了。

动态代理:代理对象和被代理对象是动态绑定的,在运行时才确定。

远程代理:代理对象位于远程机器上,被代理对象位于本地机器上。

保护代理:代理对象负责控制对被代理对象的访问,可以用于保护被代理对象。

智能代理:代理对象负责对被代理对象的调用进行优化,可以提高性能。

几种工厂模式间的关系:

简单工厂模式:是工厂模式中最简单的一种,它将创建对象的逻辑封装在一个类中,由该类来决定创建哪个对象。

工厂方法模式:是简单工厂模式的进一步抽象,它将创建对象的逻辑封装在一个接口中,由子类来实现该接口,来决定创建哪个对象。

抽象工厂模式:是工厂方法模式的进一步抽象,它将创建多个对象的逻辑封装在一个接口中,由子类来实现该接口,来决定创建哪些对象。

静态代理和动态代理之间的关系:

静态代理和动态代理都是代理模式的一种实现方式,两者的主要区别在于:

静态代理是指在编译时就确定了代理对象和被代理对象的绑定关系,而动态代理是指在运行时才确定代理对象和被代理对象的绑定关系。

静态代理的代理对象由程序员创建,而动态代理的代理对象由框架创建。

远程代理和保护代理、智能代理之间的关系:

远程代理、保护代理、智能代理都是代理模式的一种扩展,它们在原有代理模式的基础上增加了额外的功能。

远程代理增加了远程访问的功能,可以实现跨机器调用。

保护代理增加了访问控制的功能,可以控制对被代理对象的访问。

智能代理增加了性能优化的功能,可以提高被代理对象的性能。

#24届软开秋招面试经验大赏##我发现了面试通关密码#

腾讯,字节跳动,阿里巴巴,百度,美团,快手,有赞,理想,蔚来,小鹏等大厂校招笔试真题,面试真题讲解。目标100家公司

全部评论

相关推荐

09-18 21:12
已编辑
门头沟学院 Java
八股吟唱,找实习的第二次面试,昨天第一次面试被真实之后狂背了一天的八股今天还爬起来上一上午课,面试的时候都快魂飞魄散了。最近一直在沉浸式背八股,算法好久没写了😇本来暗暗庆幸这次的八股都是基本盘,结果算法不是很难也手撕不出来,语法甚至都不太对,腾讯会议约的三十分钟,我还一直在祈祷无手撕🤪十五分钟八股项目,后面一直在看我尴尬地写。面试官说话我一直听不清,,让我随便用啥写都行,伪代码也可以。真的太紧张了,看着题目脑子里都空了。我都受不了了想说我真不会能不写了吗。面试官就是淡淡的,虽然我菜成这样也就是淡淡的,然后建议我多写写代码。1.&nbsp;JVM内存结构没背,尴尬地瞎说了一点2.&nbsp;JVM里堆和栈的区别这里记忆复苏,说到了垃圾回收3.&nbsp;垃圾回收的过程,怎么标记,具体怎么做的背得不是很详细,只知道root然后顺着找,又开始瞎说了,三色标记法光知道个名4.&nbsp;介绍一下项目5.&nbsp;乐观锁解决超卖,一直在拷打,什么数据结构去存库存,版本号是啥,怎么存的,用户抢券你防止超卖的整个过程怎么做,要用lua脚本吗,脚本怎么写乐观锁我能说,但是项目细节我记得不太清楚了,差点把自己讲急眼。6.&nbsp;MySQL隔离级别,然后举了个例子问我,这个吟唱得很流畅,但是问我知不知道底层原理(看过忘了5557.&nbsp;算法:数组里出现频率第k大的元素,hot100里的,但是我还没刷到&nbsp;&nbsp;哈希表的语法我也不太熟导致真的很尴尬。我不会从现在一直面到寒假才能找到实习吧,回家吧好不好。
查看7道真题和解析
点赞 评论 收藏
分享
发面经攒人品
点赞 评论 收藏
分享
1.&nbsp;没有考虑过留在之前实习过的公司吗?2.&nbsp;你主要用的语言是&nbsp;Java&nbsp;还是&nbsp;Go?Go&nbsp;的底层你了解吗?3.&nbsp;你过去哪一段项目是你觉得比较有挑战的?能具体聊聊吗?4.&nbsp;要不先讲讲你现在在字节的项目?你介绍一下?5.&nbsp;你做的这个&nbsp;SDK&nbsp;是在解决什么问题?什么叫同步/异步?6.&nbsp;老系统和新系统,你们为什么要做迁移?老系统代码量和问题在哪里?7.&nbsp;你总结一下你做的这个&nbsp;SDK&nbsp;的核心功能,能提炼为三点吗?8.&nbsp;你的&nbsp;SDK&nbsp;是放在业务系统里的吗?9.&nbsp;如果&nbsp;SDK&nbsp;需要升级,怎么推动所有调用方升级?10.&nbsp;聊聊你在快手的项目,哪个部分最有挑战?11.&nbsp;算法:两数之和12.&nbsp;你为什么要用哈希表来做?和暴力循环&nbsp;O(n²)&nbsp;的方法相比,哈希表有什么好处?13.&nbsp;如果数组有上千万的数据,你的哈希表能装得下吗?14.&nbsp;如果内存放不下所有数据,你会怎么处理?(分块/落盘/分文件…)15.&nbsp;有没有更高效的方案?16.&nbsp;你的方法只能找到一组解,如果有多组解怎么办?17.&nbsp;你觉得现在的&nbsp;O(n)&nbsp;算法还有优化的空间吗?18.&nbsp;假设你在浏览器输入一个网站的&nbsp;URL,然后点确认,到最后看到网站页面,中间发生了什么?19.&nbsp;HTTP&nbsp;和&nbsp;HTTPS&nbsp;的区别是什么?HTTPS&nbsp;的安全性是怎么保证的?20.&nbsp;HTTPS&nbsp;的证书交换、加密解密的过程是怎么样的?21.&nbsp;HTTP/2&nbsp;和&nbsp;HTTP/1.1&nbsp;有什么区别?HTTP/2&nbsp;做了哪些优化?22.&nbsp;你最近在看什么技术?对什么方向比较感兴趣?
发面经攒人品
点赞 评论 收藏
分享
1.&nbsp;你在三家比较大的公司都有实习经历,为什么一直在换呢?2.&nbsp;你觉得这三家公司的技术体系有什么不同吗?3.&nbsp;你们的三层缓存是怎么设计的?4.&nbsp;第一层缓存(Kconf)是什么?它怎么工作的?5.&nbsp;这一层缓存和&nbsp;DB&nbsp;怎么保持一致的?6.&nbsp;你们的本地缓存过期策略是怎样的?为什么设置&nbsp;5&nbsp;秒?7.&nbsp;你们更新&nbsp;Redis&nbsp;是通过&nbsp;MQ,对吧?那&nbsp;MQ&nbsp;会丢消息吗?你们怎么保证不会丢?8.&nbsp;你们用的&nbsp;MQ&nbsp;是什么?9.&nbsp;RocketMQ&nbsp;能保证消息一定是在&nbsp;DB&nbsp;成功更新之后才投递出去吗?10.&nbsp;你知道&nbsp;RocketMQ&nbsp;的事务消息具体是怎么实现的吗?11.&nbsp;来写一段代码吧:两个线程交替打印奇偶数,打印到&nbsp;100。12.&nbsp;有没有可能存在多余的循环或空转的问题?13.&nbsp;如果线程之间没有通信,会造成什么影响?要怎么改?(比如用阻塞+唤醒机制)14.&nbsp;你可以用&nbsp;**`synchronized`**&nbsp;/&nbsp;**`Object.wait/notify`**&nbsp;或&nbsp;**`Lock`**&nbsp;来改写一下吗?15.&nbsp;来一个设计题:如果要存储全球的行政区划数据(国家、省、市、区/县、街道),你会怎么设计?16.&nbsp;不同国家层级不一样,这算一个难点,你怎么处理?17.&nbsp;你会按层级来做表设计吗?这种设计可能存在哪些问题?18.&nbsp;如果层级发生变化(比如新增一个层级),你的结构怎么应对?19.&nbsp;有没有暴力一点的方案?(比如&nbsp;JSON&nbsp;存储)20.&nbsp;那以“河北省”为例,你在这种&nbsp;JSON&nbsp;存储里会怎么表示?21.&nbsp;你的&nbsp;JSON&nbsp;存储方案有什么缺点?22.&nbsp;树型结构除了你这种方式,还有其他表达方式吗?23.&nbsp;这种树形结构会面临哪些性能问题?比如查询跨级数据的时候怎么处理?24.&nbsp;有没有更好的办法?能不能结合两种方式?25.&nbsp;在读多写少场景,你会怎么优化?
发面经攒人品
点赞 评论 收藏
分享
09-18 14:54
已编辑
门头沟学院 后端工程师
9/4&nbsp;一天三面一面:1.&nbsp;介绍实习2.&nbsp;拷打实习3.&nbsp;mq:消息丢失、顺序消息4.&nbsp;定时任务:如果任务非常久,到下一个时间新的调用开始了,怎么办?5.&nbsp;redis类型有哪些6.&nbsp;下单操作如何使用redis扣减库存7.&nbsp;redis如何实现排行榜?如何结合Mysql?8.&nbsp;线程池有哪些参数?9.&nbsp;拒绝策略有哪些?10.&nbsp;线程池的使用流程?11.&nbsp;手撕:最长不含重复子串12.&nbsp;redis如何持久化?13.&nbsp;场景题:假设天气改变了,该如何通知不同的终端,说一下设计模式+具体实现?14.&nbsp;观察者模式存在什么问题?二面:1.&nbsp;介绍实习和项目,比较能体现你技术能力的2.&nbsp;拷打实习(问了挺久)3.&nbsp;MQ:消息丢失、顺序、重复消费4.&nbsp;手撕:一道dp(不会,换了一道hot100的dp)5.&nbsp;epoll的两种实现方式?6.&nbsp;epoll和select的区别?7.&nbsp;Mysql性能怎么样?8.&nbsp;为什么你觉得他好9.&nbsp;B+树为什么快?顺序日志为什么快?10.&nbsp;你觉得Mysql有缺点吗?三面:1.&nbsp;全程实习拷打,问的比较深2.&nbsp;们公司的系统有没有你觉得设计的不合理的地方?你会怎么改?3.&nbsp;最近有在学什么技术吗?4.&nbsp;未来想做什么,比如是业务还是基建什么的?5.&nbsp;手撕:hot100的多数元素===============9/8================更新面经,现在还没任何消息===============9/18================意向!感谢滴滴
查看29道真题和解析
点赞 评论 收藏
分享
评论
2
7
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务