【问题标题】:re-arrange items into an array with no similar items next to each other将项目重新排列到一个数组中,彼此之间没有相似的项目
【发布时间】:2012-06-14 19:51:44
【问题描述】:

假设我有一组积木。 12个红色,8个蓝色,5个黄色,1个绿色。我需要创建一个算法,将这些对象输出到单个数组中,其中没有相邻的红色块,没有相邻的蓝色块等。输出应该如下所示:

红、蓝、红、蓝、红、蓝、黄、蓝、绿、红、黄等

到目前为止,在我的编程经验中,我遇到过多次必须编写算法来执行此操作的地方。我最后一次这样做是在大约 2 年前为一家初创公司工作。我在python中实现了这样一个算法,但是源代码不可用。我记得我至少花了 100 行来创作。

这个算法有名字吗?我不想再次实现它。

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    我不知道这个问题的名称。下面是我想出的解决它的算法。

    您需要跟踪每个剩余块的#。

    repeat:
    output 1 block of largest color set.
    output 1 block from the second largest color set.
    

    输出:

    r b r b r b r b r g r b r g r b r g r b r g r b g y

    注意:在运行此算法之前,您需要检查最大颜色集的大小是否大于 1 + 其他颜色大小的总和。如果是,那就没有办法了。

    注意:不需要从第二大集合中挑选。循环中的第二个选择可以来自任何非最大的颜色集。

    【讨论】:

    • 这或多或少是我想出的,除了你不需要从第二高的集合中提取,只需要从任何“非最高”集合中提取。
    • @priestc 我相信以某种方式特别对待第二个最频繁的集合是必要的。例如r r r r g b w c c c,如果我们在填充r r r r时用完g b w,那么我们就剩下所有c c c,这是不希望的。
    • @Icn,在我们输出 2 个 r 之后,c 现在是最大的集合,并且会在更多的 r 之前输出。例如:r g r b c ....
    【解决方案2】:

    就在我的脑海中 - 创建一个队列,其中包含您想要以递减数量插入的所有块(即使用上面的示例,队列将包含 12 个红色然后 8 个蓝色然后 5 个黄色然后 1 个绿色)。将队列中的一个元素插入数组的每个偶数索引,然后插入每个奇数索引(即在索引处插入一个红色块 0,2,4,6,8,10,12,14,16,18,20,22,然后在 24,1,3,5,7,9,11,13 插入蓝色,然后在 15,17 插入黄色,19,21 并在 23 处插入绿色)

    请注意,对于某些块组合,此任务是不可能的 - 在运行算法之前,您必须检查具有最高编号的块集的块数是否不超过所有块的总和除以 2

    【讨论】:

    • 你的例子是错误的。你列出有 13 个红色块。如果有 12/8/8/8 个块,你的算法也会有问题。
    【解决方案3】:
    1. 首先你需要检查这样的数组是否存在。

      例如如果你有 4 个红色,只有 1 个蓝色,那么它就不存在

      所以如果最大集合的个数小于所有其他集合的总和减1,则没有有效的解决方案

    2. 然后,您只需将您最大收藏中的所有项目(比如红色)作为一个列表放在那里。

      在列表的每一项之间,是一个可以插入其他元素的地方

      e.g. _ red _ red _ red _ red _ red _ red ...
      
    3. 现在您可以将其他项目集合插入到这些位置。集合的顺序无关紧要。

      e.g. blue red blue red blue red blue red yellow red yellow red _ red _ red ..
      

      您需要始终从左到右(或始终从右到左)消耗这些点。

      每当您用完点时,您就会从左侧(或右侧)重新开始将项目插入新点。

      e.g. green blue _ red _ blue _ red _ blue _ red _ blue _ red _ yellow _ red ...
      

    【讨论】:

    • 您的回答会说集合 3-red 2-blue ( 3 !
    • @ColinD 不,我的意思是如果它更小,那么就没有有效的解决方案.. 也许我不清楚,刚刚更新了帖子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多