1

招聘人员以书面形式向我提出了这个问题,前一个问题与字符串相关,前一个问题与控制反转有关:

如何找到数组中的第二大元素?

作为一名拥有自学/自学 JAVA 的项目经理,我的回答是:

如何定义大(整数?解析:字符串/对象?)数组有多大?冒泡排序,然后返回倒数第二个索引。暂时存储最大和倒数第二大的变量,对数组进行排序,替换合适的变量,然后返回第二大的变量。有很多方法,但是开发一个不昂贵的适当功能需要更多信息。如果范围很宽,做几个精益方法,测量数组长度,然后在数组上应用适当的方法。

这是对这个问题的有效回答吗?如果不是,你认为它需要改进什么?我之所以这样问,是因为在常见的招聘氛围中存在极大的差距,并且很难理解类似结构化问题的实际预期目的,并且需要您的反馈以了解什么/如何接近/回复。

更新我收到通知说他们通常会看到代码,但没有提供任何参数或指南,并回复如下:

我无法提供编码答案,至少不知道前两条信息。第一个将允许解析,因为数字是普遍排序的,而字符串、对象和其他是主观解析的。第二部分,处理数组长度,以及它是否是静态的,对于开发人员来说绝对是相关的,因为昂贵的代码(无论是面向用户的计算时间,还是客户端的硬件成本)可能是昂贵的。这个问题的措辞很差,无法提供准确的技术回复,特别是考虑到它是书面格式,没有反馈。我只是输入我的考虑作为答复,就像当面询问一样。我从前面的问题中得到的上下文是,他们正在寻找了解 IoC 实践(第 3 条)并且会在可能的事务(尝试/捕获)情况(第 4 条)中解析字符串(给定第 2 条)的人,然后找到(当前问题)。如果问卷的目的是了解我如何处理问题,那么我的回答是有效的。如果他们想进一步澄清,我很乐意提供帮助,但如果他们需要一个编纂的答案并且不愿意提供必要的上下文,那么我不愿意与他们合作,因为这会突出人们对如何与他们互动的误解外部客户,他们在提出一个“简单”问题时确实需要指导,但需要其他信息才能最好地适应,任何寻求外部专业帮助的企业背后的核心原因。我希望这个回复不要用刺耳的语气阅读,因为我大声回复时的节奏完全相反,因为需要进一步的信息,包括如果在 JAVA 中单独开发是否在这份工作的范围内,因为我精通 JS和 Python 也是如此,昨天没有讨论这个问题。希望您和您的客户能够理解,使用招聘人员方法,抽象层可以在许多领域受益,但在这种情况下,如果没有直接的沟通和反馈,它可能会阻碍和模糊认知。除了我的回答之外,请随时提供这个。包括如果单独的 JAVA 开发在这个工作的范围内,因为我也精通 JS 和 Python,这个昨天没有讨论过。希望您和您的客户能够理解,使用招聘人员方法,抽象层可以在许多领域受益,但在这种情况下,如果没有直接的沟通和反馈,它可能会阻碍和模糊认知。除了我的回答之外,请随时提供这个。包括如果单独的 JAVA 开发在这个工作的范围内,因为我也精通 JS 和 Python,这个昨天没有讨论过。希望您和您的客户能够理解,使用招聘人员方法,抽象层可以在许多领域受益,但在这种情况下,如果没有直接的沟通和反馈,它可能会阻碍和模糊认知。除了我的回答之外,请随时提供这个。

并获得好评。感谢您的帮助,因为我真的很想获得一份编程工作,但之前没有正式的经验,这个指导真的很有帮助。

4

5 回答 5

3

在这种情况下,我认为面试官真的想知道为了找到第二大元素,是否必须对整个数组进行排序(并选择第二个元素)还是有更好的方法

答案是您不必为了找到前 k 个元素而对整个数组进行排序。排序将花费 O(nlgn) 时间,而查找前 k 个项目只需 O(nlogk)。

您可以使用简单的示例来解释答案。如果你必须在 100 张卡片中找到第二大卡片,数字从低到高。卡片没有排序。要找到第二张最大的牌,你所要做的就是拿着你手上迄今为止见过的前两张牌。当你挑选新牌时,看看它是否比你手上的大,如果是的话,用手上最小的替换新的最大的。在此过程结束时,您最终将持有前 2 张牌。

编辑:就像其他人所说,冒泡排序的运行时间最差 O(n^2)。为了好玩,请查看奥巴马总统对排序面试问题的回答。http://www.youtube.com/watch?v=k4RRi_ntQc8

于 2012-06-27T16:15:22.990 回答
1

完成所需任务的最有效方法是显而易见的:在数组上迭代一次并寻找“最大”元素,同时还存储前一个“最大”元素。在数组的末尾,您之前的“最大”元素是您的方法需要返回的元素。

为了制定您的答案,我看到了 2 个选择:

  • 从“假设数组包含 int 元素......”或其他接近的东西开始你的答案。
  • 使用未定义的 isLargest() 或 isLarger() 方法并解释该方法的目的是检查当前元素是否是当前检查的最大元素,无论它意味着什么。
于 2012-06-27T16:00:33.580 回答
0

这是相当主观的,但坦率地说,我同意你关于这个问题的问题——他们应该已经定义了你的数组包含的内容。

你可以做的是写类似“假设数组中的元素都是整数,这就是我的做法”,然后用这个假设给出你的答案。

对于您对其他信息的其他请求,我将按照相同的步骤进行 - 做出假设,声明您的假设,然后继续进行该假设。

于 2012-06-27T15:31:49.123 回答
0

似乎有效 - 我只是担心他们想要代码。我想也许你应该假设整数并在你所说的之外写一些东西。

于 2012-06-27T15:35:40.867 回答
0

我最初的直觉反应是“修改合并排序”,使用 ForkJoinPool 实现。它仍然是 O(n log[n]),但实际运行时间会比串行实现快。

您可能会问为什么不进行快速排序,这是因为快速排序的最坏情况是 O(n^2),这对于非常大的数据集是不利的。改进的合并排序具有更可预测的性能和更好的最坏情况 O(n log[n])

于 2012-06-27T17:58:58.850 回答