将相似类型的元素放在一起

时间:2017-10-05 03:52:09

标签: algorithm

我在某个地方读过这个采访问题并试图解决它:

给出一个水果摊位(最多8种不同类型的水果)。将相似类型的水果放在一起。 限制:a)水果摊位是你的整个世界(即不要使用额外的空间),b)取一个水果并知道它的类型(getType())是一项代价高昂的操作,但交换是一种非常便宜的操作。

注意:您需要编写一个代码来处理所有情况,并记住最大类型的水果可以是8。

因此,我想到的想法是,我们需要为所有水果(数组元素)调用getType(),然后根据特定类型对它们进行相应的排序。如果不知道水果的类型以及什么是解决这个问题的最佳方法,我无法知道如何进行交换?

2 个答案:

答案 0 :(得分:1)

由于这是一个面试问题,我将假设你的水果摊是一个阵列。将数组划分为八个区域,以便每个区域仅包含给定类型的果实,使用七个指针,一个指向除第一个区域之外的每个区域的开头。使用第八个指针指向未排序区域的开头。

初始化指针指向数组的开头。获取指针的定义是棘手的,因为你必须覆盖没有给定类型的果实的情况。一种可能的定义是指针i包含到目前为止排序的水果数量,包括i,i = 1..8。然后在开始时将所有指针设置为等于零并且1 1 1 2 2 3 4 4 |对应于p1 = 3 p2 = 5 p3 = 6 p4 = 8 p5 = p6 = p7 = p8 = 8

反复查看未分类区域开头的第一个水果,找出它的类型。如果不应该进入最终区域,则将其与最终区域开头的元素交换,并将指针前进到最终区域的开头。如果它不应该进入倒数第二个区域,则将它与第二个最后一个区域开头的元素交换,并将指针前进到第二个最后一个区域的开头......依此类推,直到新的水果位于正确的位置。现在将指针推进到第一个未分类的水果并重复。

这会查看每个水果一次,我不认为你可以用较少的getType()调用进行排序。你不关心掉期数量,所以我认为这是最优的。

我将列出显示以c1,c2,c1,c3,c2,c1,c4,c4开头的交换的行。我不打算写cs,我将使用|划分左边的区域,其中所有内容都是从右边区域中已知的类型未知的

| 1 2 1 3 2 1 4 4

1 | 2 1 3 2 1 4 4

1 2 | 1 3 2 1 4 4

1 1 | 2 3 2 1 4 4

1 1 2 | 3 2 1 4 4

1 1 2 3 | 2 1 4 4

1 1 2 2 | 3 1 4 4

1 1 2 2 3 | 1 4 4

1 1 2 2 1 | 3 4 4

1 1 1 2 2 | 3 4 4

1 1 1 2 2 3 | 4 4

1 1 1 2 2 3 4 | 4

1 1 1 2 2 3 4 4 |

答案 1 :(得分:0)

这很可能是作为就地合并排序完成的。如你所述,立即检查每个水果的类型。这不会消耗任何额外的内存(许多关于如何进行就地合并排序的指南)只会调用一次getType(),并且会导致nlog(n)运行时内存使用n

有没有我们知道的信息?看起来这个问题的措辞是这样的,他们通常会给我们另一种方法来避免不必进行getType()次n次呼叫。如果这是一个亲自面试的问题,如果这个练习的目标应该随着面试官开始进入而不应该感到惊讶。这可以解释为什么他们特别提到getType()是昂贵的