📜  Wissen 面试经历

📅  最后修改于: 2021-09-23 06:05:39             🧑  作者: Mango

第 1 轮:在线测试

由基于Java的 MCQ 组成——预测输出、多线程等。
两个编程问题——

  • 实现接口的函数——使用 HashMap,其中键(或值)是一个自定义类——也必须实现 hashCode() 和 equals() 方法。
  • 给定一个木头和一个函数,该函数根据距离原木左侧的距离(比如 x)返回原木的重量。原木的重量不均匀(即左侧的中点不一定具有重量 = 完整原木的一半),因此任务是从原木左侧找到重量恰好为一半的点。方法类似于二分查找。由于时间太短,无法解决,但规则中提到,即使问题没有解决,算法也可以给你加分。

两个 SQL 问题——一个使用 JOIN,另一个使用嵌套查询。

一周后接到下一轮的电话。

第二轮:电话面试

  • 说说你自己。
  • 编译时与运行时多态性——编译时重载而运行时重载
  • 不可变对象 – 它是什么,如何使对象不可变(最终类)以及如果在不可变类中使用可变对象(返回原始对象的克隆),如何确保存在不变性。
  • Hashmap(它是如何工作的)、并发 hashmap(它是如何工作的)、treemap(搜索的复杂性——我说 O(logn) 并解释了它作为 rb 树实现,它在最坏的情况下提供了保证的 O(logn) 性能)。
  • ArrayList 与 LinkedList – 如果没有索引机制,您将如何搜索元素(遍历列表)以及哪个元素会导致更快的搜索(我说的是数组列表)。
  • Reverse a LinkedList – 使用两个列表给出了基本解决方案,他要求更多,但我无法给出答案。
  • 线程中的等待与睡眠——睡眠不会改变线程的状态,如果线程正在运行,它会保持运行。他要求解释,我用生产者-消费者的例子解释。 (我错了, sleep 确实将线程的状态从 RUNNING 更改为 THREAD_WAITING。区别在于 sleep 不会释放对资源的锁定)。
  • 给定一个字符串列表,创建一个二维数组,这样每一行都将存储一个字符串的所有字谜。我给了他蛮力解决方案,但他想要优化的东西,我做不到。

第三轮:电话面试

  • 说说你自己。
  • 抽象与接口。你知道接口中的默认方法吗? – 我说不。它基本上是Java 8中引入的一些特性。
  • 什么是多态?给出多态的现实生活中的例子——用于覆盖、从活期和储蓄账户中提取、用于超载、通过支票和现金存款。
  • 什么是序列化?我告诉他概念,但她开始询问内部结构——我试图回答但不能。她告诉我,如果您只知道概念,请提前告诉她,以免她询问内部结构。
  • 给定具有静态 printContent 方法的类 A 和扩展 A 并覆盖 printContent 方法的类 B。在main中,A obj1 = new B(); obj.printContent();一个 obj2 = null; obj2.printContent() – 告诉输出将是什么。 (两个 printContent() 调用都将打印“A”)。
  • Final、finally 和 finalize 关键字——我不知道 finalize(finalize 是(一种方法)用于在对象被垃圾收集之前执行清理处理。)。
  • 不可变类(不能继承)是什么意思?给定具有名称和主题列表的类 Person。使类不可变——在列表 getter函数,返回列表的克隆。
  • 异常 vs 错误——我很喜欢这个,因为我已经很长时间没有研究过它了。 (见这个)。
  • ArrayList 与 LinkedList – 搜索与插入。
  • TreeSet 与 HashSet、ConcurrentHashMap 与 Hashtable。
  • HashMap 与 TreeMap。给定一个具有成员名称的 Employee 类,这个类在 HashMap 和 TreeMap 中都用作键。我们需要向 Employee 类添加什么方法。我说 hashCode() 和 equals() – 但她问 TreeMap 是否需要 hashCode 和 equals,我想了想说不需要,我们需要为 TreeMap 实现 Comparable 和覆盖 compareTo 方法。解释HashMap的内部工作。当她问哈希码是应用于键值还是键时,我感到很困惑——我后来说只是键并继续它。如果哈希码被覆盖,它总是返回 1,它会如何影响 HashMap——我说过只使用 1 个存储桶,在最坏的情况下搜索时间将是线性的。
  • SQL 查询 – 给定表学生(学生 ID,姓名),课程(课程 ID,姓名)和学生课程(主要 ID,学生 ID,课程 ID)。提供注册超过 3 门课程的学生姓名。首先我给出了嵌套查询的解决方案,然后她要求另一种方法,所以我尝试使用 join 但卡在我们必须计算课程的地方。
  • 问题解决问题 1 – 给定一个链表,从给定该节点的引用的那个节点中删除一个节点。它应该在 O(1) 中。我试过了,但做不到。解决方法:复制当前节点下一个节点的内容,删除下一个节点。
  • 问题解决问题 2 – 什么是堆栈?使用堆栈实现队列。

第四轮:F2F 面试

  • 因为我用过 C++,他们知道 C++ 有 OOPS,所以他们让我讲述各种 OOPS 概念:多态、继承、抽象、封装、数据隐藏。
  • 关于抽象类与接口的许多(令人困惑的)问题。
  • 解释多态性、编译时与运行时多态性、重载和覆盖示例(以及基于此的许多令人困惑的问题,例如是否可以覆盖静态方法等)。
  • 异常及其类型。他们给出了一段代码,其中基类函数抛出IOException,派生类函数抛出异常,函数是覆盖函数,所以他们问输出是什么?
  • 对象类及其方法。 hashcode 和 equals 的默认实现。 hashcode 的重要性——我举了 HashMap 的例子,所以他们询问了它的工作原理。
  • SQL 查询 – 嵌套查询(在列中查找第二个最大值)和内连接。
  • 问题解决:
    给定一个数组,您必须找到最接近元素的值(在其左侧)。设离数组第一个元素最近的元素 (arr[0]) 为 -1。
    例如 1 3 2 3 5 4
    输出将是 -1 1 1 2 3 3。提示使用堆栈。
  • 设计问题:实现模式锁。他们暗示使用一些数学运算来比较两种模式。一开始想用Hash函数,后来觉得XOR操作会更好。因此,我使用位操作( Java的BitSet)来索引每个点,如果第 i 个点出现在模式中,则设置第 i 个位。 (后来,我不确定我是否正确)。
  • ArrayList 与 LinkedList – 在插入、搜索和删除方面更快。
  • 给定从 1 到 100 的数字,您将如何对它们进行排序?快速排序 (nlogn)。但是由于范围是给定的(并且很小),我们可以使用计数排序。
  • 给定一个数组,最多可找到 10 个元素(顺序无关紧要)。使用堆。他们要求进一步优化。我想不出任何办法,所以他们建议将堆的大小保持为 10。我最初想到的是最大堆,但后来他们再次暗示为什么不尝试最小堆。使用最小堆插入前 10 个元素,找到最小,删除最小元素,插入下一个元素,找到最小,依此类推。重复 len(arr) – 10 次,剩余最多 10 个元素。