-1

逆に申し訳ありませんが、本質的に、最初の真の要素を見つけてから、最後の有効な要素が見つかるまで循環的に後方に移動し、配列を循環的に逆方向にトラバースして真の最後の要素が見つかったら、循環的に前進し、false になるまでプッシュします。見つかった。

bool、int のペアの配列が与えられます。

配列には常に 4 つの要素があります。true の要素は循環的にリンクされます。例:

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 番目と最初の要素が true の場合、それらは切断されておらず、不連続ではなく、3,4,1 は連続していると見なされることを意味します。

したがって、TFTT を使用している場合は、3、4、1 の順序にする必要があります。

4

2 に答える 2

1

配列は、次の 3 つのセグメントを含むと考えることができます。

  1. 先頭に 0 個以上の T 要素
  2. 中央に 1 つ以上の F 要素
  3. 末尾に 0 個以上の T 要素

(配列に F 要素がまったくない可能性がある場合は、それを特別なケースとして処理できます。)

必要なのは、セグメント 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) を反復処理し、それらの要素を結果の配列に追加します。
于 2012-06-02T21:27:24.267 に答える
0

このように要素を保存するとします

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

次に、このようにリストを2倍にする必要があります

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 に答える