2012-06-02 72 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