Mutarea algoritmului elementului circular?

Vreau să spun că, în esență, îmi pare rău, găsiți în mod esențial primul element adevărat, apoi mișcați înapoi circular până când găsiți ultimul element valabil, odată ce ultimul element care este adevărat este găsit prin traversarea circulară a matricei, mergeți în față circular și împingeți până când e gasit.

Mi se dă o serie de perechi de bool, int.

Matricea are întotdeauna 4 elemente. Elementele care sunt adevărate sunt legate circular între ele ex:

TFFT
TTFT
FFTT
FTTT
TFFF
FTTF

Acestea sunt toate matrice valide pe care le-aș putea avea. Numărul pe care îl conțin nu este important pentru aceasta (a doua valoare a doua).

Ceea ce trebuie să fac este: păstrați numai cele adevărate. Dar am nevoie ca ei să rămână în ordinea circulară corectă, astfel încât ultimul adevărat element valabil va veni primul.

Deci, de exemplu: Dacă matricea mea era:

T 1
F 2
F 3
T 4

Noua matrice trebuie să fie:

T 4
T 1

Alt exemplu: Dacă matricea mea era:

F 1
T 2
T 3
F 4

Noua matrice trebuie să fie:

T 2
T 3

Acesta este doar un exemplu abstract al problemei. Codul real este complex și greu de citit. Dar dacă știu cum să fac asta, o să fiu în regulă.

În esență, trebuie să merg în sensul acelor de ceasornic de la primul element discontinuu până la ultimul element învecinat.

Mulțumiri

Editați | ×: Prin legătură circulară, vreau să spun că dacă al patrulea și al primului element sunt adevărate, ele nu sunt deconectate, ceea ce înseamnă că ele nu sunt discontinue, iar 3,4,1 este considerată contiguă.

Astfel, dacă ai avut TFTT, atunci am nevoie ca ei să fie în ordinea de 3,4,1.

0
@ HighCommander4 Vreau să spun că, în mod invers, îmi pare rău, în esență, găsesc primul element adevărat, apoi mișcă circular înapoi până când găsești ultimul element valabil, apoi circular mergeți înainte și împingeți până când se găsește un fals.
adăugat autor jmasterx, sursa
Îți poți explica ce vrei să spui prin "legat circular"?
adăugat autor bitmask, sursa
Descrierea dvs. "Dar am nevoie ca ei să rămână în ordinea circulară corectă, astfel încât ultimul adevărat element valabil va veni primul" nu se împerechează cu al doilea exemplu. În cel de-al doilea exemplu, spui că "T2" ar trebui să vină mai întâi. Dar cum este "T 2" "ultimul adevărat element valabil"?
adăugat autor HighCommander4, sursa

2 răspunsuri

Vă puteți gândi că matricea dvs. conține trei segmente:

  1. 0 sau mai multe elemente T de la început
  2. 1 sau mai multe elemente F în mijloc
  3. 0 sau mai multe elemente T la sfârșitul

(Dacă matricea dvs. ar putea să nu aibă în niciun fel elemente F, atunci puteți face acest lucru ca un caz special.)

Ceea ce doriți este o matrice nouă care conține segmentul 3 urmat de segmentul 1, iar segmentul 2 este șters.

Iată o schiță a unui algoritm pentru a face acest lucru:

  • Găsiți indicele primului F din matrice. Sunați-l first_F.
  • Găsiți indexul ultimului F din matrice. Se numește last_F.
  • Acum știți că segmentele dvs. ocupă indicii [0, first_F), [first_F, last_F] și, respectiv, [last_F + 1, size_of_array).
  • Iterați peste segmentul [last_F + 1, size_of_array) și adăugați elementele în matricea de rezultate.
  • Iterați peste segmentul [0, first_F) și adăugați acele elemente în matricea de rezultate.
0
adăugat

Să presupunem că vă păstrați elementele de genul asta

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

Apoi trebuie să dublezi lista, ca asta

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

Now what you need to do essentially is to find the longest sub-list that all have T

A special corner case is that the original list is all T

0
adăugat