移动圆阵元素算法?

时间:2012-06-02 20:57:35

标签: c++ algorithm

我的意思是反过来抱歉,基本上,找到第一个真正的元素,然后循环向后移动直到找到最后一个有效元素,一旦通过循环反向遍历数组找到最后一个为真的元素,循环前进并推送直到发现错误。

我得到了一对bool,int。

数组总是有4个元素。真实的元素循环链接在一起ex:

TFFT
TTFT
FFTT
FTTT
TFFF
FTTF

这些都是我可以拥有的有效数组。 它们包含的数字对此并不重要(第二对值)。

我需要做的是: 只保留真实的。但我需要它们保持正确的循环顺序,以便最后一个有效的真元素出现。

所以例如: 如果我的阵列是:

T 1
F 2
F 3
T 4

新阵列必须是:

T 4
T 1

另一个例子: 如果我的阵列是:

F 1
T 2
T 3
F 4

新阵列必须是:

T 2
T 3

这只是问题的一个抽象例子。实际的代码很复杂,难以阅读。但如果我知道怎么做,我会没事的。

基本上我需要顺时针从第一个不连续元素走到最后一个连续元素。

由于

编辑: 通过循环链接在一起我的意思是如果第4个和第一个元素是真的,它们不会断开连接意味着它们不是不连续的,3,4,1被认为是连续的。

因此,如果你有TFTT,那么我需要它们的顺序为3,4,1。

2 个答案:

答案 0 :(得分:1)

您可以将阵列视为包含三个片段:

  1. 开头的0个或更多T元素
  2. 中间有一个或多个F元素
  3. 最后的0个或更多T元素
  4. (如果您的数组可能根本没有任何F元素,那么您可以将其作为特殊情况处理。)

    你想要的是一个新的数组,其中包含段3,后面是段1,段2被删除。

    以下是执行此操作的算法大纲:

    • 找到数组中第一个F的索引。先叫它_F。
    • 查找数组中最后一个F的索引。称之为last_F。
    • 现在你知道你的片段分别占据了索引[0,first_F),[first_F,last_F]和[last_F + 1,size_of_array]。
    • 遍历段[last_F + 1,size_of_array]并将元素添加到结果数组中。
    • 遍历段[0,first_F)并将这些元素添加到结果数组中。

答案 1 :(得分:0)

假设您存储了这样的元素

l= [(T, 1),
    (F, 2),
    (F, 3),
    (T, 4),]

然后你需要加倍列表,比如

l= [(T, 1),
    (F, 2),
    (F, 3),
    (T, 4),
    (T, 1),
    (F, 2),
    (F, 3),
    (T, 4),]

现在你需要做的就是找到所有T

的最长子列表

一个特殊的角落案例是原始列表全是T