-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 的顺序排列。

4

2 回答 2

1

您可以将数组视为包含三个段:

  1. 开头有 0 个或多个 T 元素
  2. 中间1个或多个F元素
  3. 末尾有 0 个或多个 T 元素

(如果您的数组可能根本没有任何 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) 并将这些元素添加到结果数组中。
于 2012-06-02T21:27:24.267 回答
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

于 2012-06-02T21:27:27.700 回答