4.26 快手暑期实习测开一面(约50min)

  1. == 和 equals() 的区别

  2. String 中 equals() 的实现

  3. 介绍 HashMap 的底层实现

  4. HashMap 的扩容机制,当数组的长度达到多少时会进行扩容,长度的单位是什么

  5. JDK1.8 之前 HashMap 是怎么用数组和链表组成的

    原来是用数组作为主体,链表主要是为了解决哈希冲突(用拉链法解决冲突),

    我说成数组存键,链表存值了。。我是傻呗。。

  6. 红黑树的结构

  7. 为什么要在 JDK1.8 的 HashMap 中引入红黑树(减少搜索时间)

  8. 为什么用红黑树,B+树的高度很矮,查询速度也很快,为什么不用 B+树呢

  9. 你了解线程吗?知道线程池吗?

  10. 线程的创建方式

  11. 什么是线程池?

  12. 为什么要用线程池?

  13. 如何创建线程池?

  14. 线程池处理任务的流程

  15. 当任务数很少而线程池中的线程很多怎么办?

  16. 介绍几种你了解的排序算法

  17. 快排的实现原理

  18. 树的遍历方法?除了递归遍历还有别的吗?

  19. 树的存储结构

  20. 算法题:力扣原题--合并两个有序链表(输入输出要自己写,难受)

    最后是写了核心代码,跟面试官讲自己的思路,输入不太熟练

  21. 反问环节:

    a. 一共有几轮?三轮,两轮技术,一轮 HR

    b. 多久出结果?不确定,看 HR 那边反馈

    c. 这是测开岗吧?(没错,面的我都怀疑是不是测开岗了)部门的业务方向是?

真的是头大,问了好多数据结构和算法

我看牛客上的大佬们都说是问项目和测试方法啊,怎么到我这变数据结构了?

#快手##暑期实习##测开#
全部评论
假设我们有一个 HashMap,初始大小为 16,加载因子为 0.75。现在我们要往这个 HashMap 中插入一些键值对。 初始状态下,HashMap 中有一个大小为 16 的数组,每个数组元素都是一个桶。 我们插入一些键值对,根据键的哈希值确定它们应该放置在数组的哪个位置。 当某个位置的桶中出现了多个键值对,发生了哈希冲突,这时就会形成链表。 如果链表的长度超过了阈值(默认为 8),则该链表会被转换为一棵红黑树,以加快检索操作的效率。 如果插入的键值对数量超过了当前数组大小乘以加载因子(即 size > capacity * loadFactor),HashMap 会自动进行扩容操作,将数组大小翻倍,并重新计算每个键值对应的位置。
1
送花
回复 分享
发布于 04-27 11:14 广东
红黑树是一种自平衡的二叉查找树,它具有以下特性: 每个节点要么是红色,要么是黑色。 根节点是黑色的。 每个叶子节点(NIL 节点,空节点)是黑色的。 如果一个节点是红色的,则其子节点必须是黑色的(不能有两个相邻的红色节点)。 从任意节点到其每个叶子节点的所有路径都包含相同数量的黑色节点(即,黑色节点的高度相同)。
1
送花
回复 分享
发布于 04-27 11:20 广东
国泰君安
校招火热招聘中
官网直投
你这个完全是八股轰炸
1
送花
回复 分享
发布于 04-27 14:23 北京
假设我们的系统有 4 个 CPU 核心,并且我们希望任务的平均响应时间在 100 毫秒以内。我们可以按照以下步骤来设置线程池大小: 确定 CPU 核心数:系统有 4 个 CPU 核心。 确定任务特性:任务是 I/O 密集型的。 设置线程数:根据公式 线程数 = CPU 核心数 * (1 + 等待时间 / 计算时间) 来计算。假设等待时间是任务响应时间的 90%,计算时间是任务响应时间的 10%。因此,线程数 = 4 * (1 + 0.9 / 0.1)= 40。这是一个初始值,稍后我们可以根据实际情况进行调整。
点赞
送花
回复 分享
发布于 04-27 11:19 广东
B+树和红黑树是两种不同的数据结构,各自适用于不同的场景和应用需求。虽然 B+树在某些方面有其优势,但在 HashMap 中使用红黑树而不是 B+树可能是出于以下考虑: 1. **内存占用和指针开销**:B+树通常需要更多的指针来维护节点之间的连接关系,这可能会增加内存占用和访问时间。相比之下,红黑树的节点结构相对简单,只需要保存左右子节点的指针、键和值。 2. **实现复杂度**:B+树的实现相对复杂,包括节点分裂、合并、移动等操作,而红黑树的实现相对简单,更易于理解和维护。 3. **数据分布的特点**:HashMap 中的元素是通过哈希函数进行分布的,而 B+树是一种有序的树结构,适合于有序数据的存储和检索。在 HashMap 中,元素的分布可能是不均匀的,因此红黑树更适合用于处理这种不确定的、哈希碰撞导致的链表长度过长的情况。 4. **查询操作的频率和效率**:虽然 B+树在范围查询等场景下具有较好的性能,但在 HashMap 中,主要的操作是根据键进行查找,而不是范围查询。在这种情况下,红黑树的查找操作可能会更加高效。
点赞
送花
回复 分享
发布于 04-27 11:23 广东
来合并两个有序链表。具体步骤如下: 1. 创建一个虚拟头节点 `dummy`,以及一个指针 `current` 指向 `dummy`。 2. 使用 `while` 循环,遍历两个链表 `l1` 和 `l2`,直到其中一个链表为空。 3. 在循环中,比较 `l1` 和 `l2` 当前节点的值,将较小的节点连接到 `current` 的下一个节点,并将相应链表的指针向后移动。 4. 当其中一个链表遍历完成后,将剩余链表的部分直接连接到 `current` 的下一个节点。 5. 返回虚拟头节点的下一个节点,即合并后的链表的头节点。 这样就完成了两个有序链表的合并。
点赞
送花
回复 分享
发布于 04-27 13:27 广东
挂掉啦,很快啊😅就是故意来刁难人的
点赞
送花
回复 分享
发布于 04-28 11:27 江西
而且我这还只是暑期实习真无语
点赞
送花
回复 分享
发布于 04-28 11:28 江西

相关推荐

RESTful API是一种基于HTTP协议的Web服务架构风格,它以资源为中心,通过HTTP方法(如GET、POST、PUT、DELETE)对资源进行操作。下面是一些常见的RESTful API设计规范和最佳实践:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&uuid=b48bebe08e474db8b80b853b12bafd48使用清晰的资源命名:API的端点应该使用名词,而不是动词。例如,使用"/users"来表示用户资源的集合,使用"/users/{id}"来表示单个用户资源。使用HTTP方法进行操作:使用HTTP的不同方法(GET、POST、PUT、DELETE)对资源进行不同的操作。GET用于获取资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源。使用HTTP状态码:正确使用HTTP状态码可以提供有关请求结果的信息。常见的状态码有200表示成功,201表示资源创建成功,400表示客户端请求错误,404表示资源不存在等。使用资源版本控制:在API中引入版本控制是一种良好的实践,可以确保对API进行更改时不会破坏现有的客户端应用程序。使用合适的数据格式:常见的数据格式包括JSON和XML,但根据需求也可以选择其他的格式。JSON是当前最常用的格式,因为它是轻量级的、易于阅读和解析的。使用正确的HTTP头部信息:使用合适的Content-Type头部信息来指示请求或响应中的数据格式,并使用合适的Accept头部信息来指示客户端期望的响应数据格式。使用URI来表示关系:在URL中使用合适的路径表示资源之间的层次关系或关联关系,遵循RESTful风格。提供合适的错误处理:在API中,要提供清晰和有用的错误信息,包括错误代码、错误消息和可能的解决方案。使用认证和授权机制:对于需要身份验证和授权的API操作,应该实施适当的安全措施,如使用API密钥、OAuth等来保护资源的访问。
点赞 评论 收藏
分享
5 22 评论
分享
牛客网
牛客企业服务