一位采访者问我如何找到一个随机数组中最大的数字。我回答整个阵列循环找到最大的数字,但他说这将花费太多时间。我想知道是否有更好的解决方案。有什么建议吗?
答案 0 :(得分:9)
您的面试官可能希望您深入了解详细信息。当我采访某人时,我会找人问这些问题:
我可能会回答:“他们的年龄在15到99之间。而且他们有100,000,000人。”这将导致一个明显的优化:如果你看到一个99,打破你的循环并返回99.这可以节省大量的时间。如果数字是均匀分布的(您应该问!),这将使您需要查看的平均项目数从100,000,000到100以下。
我所寻找的是问题。在不知道细节的情况下,我不希望有人跳进去做他们认为“正确”的事情。
即使没有愚蠢的限制,一个好的候选人也会试图找出适合的系统类型。显然,在数组中找到最高数字并不是一次性的事情。如果我需要一次又一次地重复获得次高的数字,首先对其进行排序是有道理的。如果阵列将会增长并且我需要继续保持最高值,那么堆就有意义了。
你永远不会知道你的面试官在想什么,因为你没有深入研究。这可能是她所寻找的全部,你的问题。但即使她不是,即使她只是在摸索这个问题,通过确定细节,你会证明你知道你在说什么。
答案 1 :(得分:2)
如果数组中的项是随机的,则最大的数字可能位于任何位置,因此您需要读取数组中的每个项以找到最大的项。鉴于假设,您的提案是最有效的方法......
答案 2 :(得分:2)
如果阵列很大,那么 是一种更快的方式 - 在CPU周期方面不是更快,但在挂钟方面更快。您可以将数组细分为多个部分(不是通过复制它,而是通过识别开始/结束点),然后在单独的线程中搜索每个部分。完成所有线程后,找到每个线程中找到的最大数字。这样,您将能够更快地解决问题X倍,其中X是计算机上的核心数。
答案 3 :(得分:1)
这很可能是采访者用来让你承受压力的伎俩,并通过捍卫你的答案来“表现出坚果”。
除非对数组进行排序,否则没有更快的方法可以做到这一点。如果以某种方式对值进行排序或预先组织,则它可能看起来不同。
答案 4 :(得分:0)
您需要查看数组中的每个元素,因为它是未排序的。我认为当面试官说需要很长时间时,你应该说,“是的,这可能需要很长时间,但这是唯一的方法。”
答案 5 :(得分:0)
也许他正在测试你对算法的了解。
您的方法可能需要O(n),还有其他排序算法可以将此随机数组排序为有序数组,例如quicksort进行O(nlogn)比较。它可能有一个糟糕的坏情况,但这种情况很少见。
在采访中,我发现最好总结出你的想法,你的假设是你的逻辑,以便你的面试官处于循环中,并了解你的想法。