2012-06-02 49 views
-1

我的意思是反向抱歉,本质上是找到第一个真正的元素,然后循环向后移动,直到找到最后一个有效元素,一旦通过循环反向遍历数组找到最后一个元素,循环前进,发现错误。移动圆形数组元素算法?

我给了一双bool,int的数组。

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

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。

+0

你能解释一下“循环链接”的含义吗? – bitmask

+0

您的描述“但我需要他们保持正确的循环顺序,以便最后一个有效的真实元素会先到达”与您的第二个示例不匹配。在你的第二个例子中,你应该先说“T 2”。但“T 2”如何是“最后有效的真实元素”? – HighCommander4

+0

@HighCommander4我的意思是反过来抱歉,基本上,找到第一个真正的元素,然后循环向后移动,直到找到最后一个有效元素,然后循环前进,直到发现错误。 – jmasterx

回答

1

可以认为你的阵列为包含三个部分:在所述中间

  • 0或多个T元件在开始

    1. 0或多个T元件
    2. 1或多个F元素结束

    (如果你的阵列可能不带任何FU元素,那么你可以处理,作为一个特殊的情况。)

    你想要的是一个新的数组,其中包含段3,接着段1,段2被擦除。

    下面是一个算法的轮廓做到这一点:

    • 找到的第一个F的数组中的索引。叫它first_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)并将这些元素添加到结果数组中。
  • 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