Probleme de codare și soluții-4

[1] Având un tablou int reprezentând lungimea de n bucăți de lemn și un int k. Este necesar să tăiați aceste bucăți de lemn astfel încât să fie tăiate mai mult sau egal cu k bucăți de aceeași lungime. Care este cea mai lungă durată pe care o poți obține?

Exemplu

(https://leetcode.com/discuss/interview-question/354854/)

Abordare – Utilizați căutarea binară

[2] Distanța cea mai mică la caracter – Având în vedere un șir S și un caracter C, returnați o matrice de numere întregi reprezentând cea mai mică distanță de la caracterul C din șir.

Exemplu:

(https://leetcode.com/problems/shortest-distance-to-a-character/)

[3] Task Sc h eduler – Având în vedere o matrice de caractere care reprezintă sarcini pe care trebuie să le facă CPU. Conține litere majuscule de la A la Z în care litere diferite reprezintă sarcini diferite. Sarcinile ar putea fi realizate fără comanda inițială. Fiecare sarcină ar putea fi realizată într-un interval. Pentru fiecare interval, procesorul ar putea termina o sarcină sau doar să fie inactiv.

Cu toate acestea, există un interval de răcire non-negativ n care înseamnă între două aceleași activități, trebuie să existe cel puțin n intervale în care CPU efectuează sarcini diferite sau doar să fie inactiv.

Trebuie să returnați cel mai mic număr de intervale pe care CPU le va lua pentru a termina toate sarcinile date.

Exemplu:

(https://leetcode.com/problems/task-scheduler/)

Abordare – Pentru intervalul de timp i, luați în considerare sarcina cu cel mai mare număr rămas. Dacă cea mai mare sarcină de număr rămasă a fost luată în ultimele n sloturi, atunci plasați sarcina în slotul n + 1 la distanță de ultimul slot pentru aceeași sarcină și continuați cu slotul curent.

[4] Sortare pentru clătite – Având în vedere o matrice A, putem efectua o clătire: alegem un număr întreg pozitiv k ≤ A. lungime apoi inversăm ordinea primelor k elemente ale lui A. Vrem să realizăm zero sau mai multe clătite (făcându-le una după alta succesiv) pentru a sorta matricea A.

Matricea A este permutarea de la 1 la N.

(https://leetcode.com/problems/pancake-sorting/)

Abordare – Începeți prin plasarea lui N în poziția corectă, adică la sfârșitul matricei. Urmat de N-1, N-2 și așa mai departe.

[5] Proiectați o structură de date care să susțină toate operațiunile următoare în timp mediu O (1).

(https://leetcode.com/problems/insert-delete-getrandom-o1-duplicates-allowed/)

Abordare – Utilizați o listă dublă legată pentru inserare și eliminare. Pentru getRandom, utilizați o matrice pentru a adăuga noduri.

Ori de câte ori este eliminat un nod din mijlocul listei, înlocuiți-l cu nodul din coada listei.

Generați un număr aleatoriu între 0 și lungimea listei-1 și preluați nodul corespunzător numărului aleatoriu din matricea de noduri.

[6] Eliminare minimă pentru a face o paranteză validă – Având în vedere un șir de caractere ‘(‘ și ‘)’ și caractere engleze mici.

Sarcina dvs. este să eliminați numărul minim de paranteze, în orice poziție, astfel încât parantezele rezultate șirul să fie valid și să returneze orice șir valid.

În mod formal, un șir de paranteze este valid dacă și numai dacă:

Exemplu:

(https://leetcode.com/problems/minimum-remove-to-make-valid-parentheses/)

Abordare – în timpul iterației directe eliminați o paranteză dreaptă ori de câte ori numărul parantezei drepte depășește numărul de paranteze stânga.

În mod similar în timpul iterației înapoi, eliminați o paranteză stângă ori de câte ori numărul de paranteze stânga depășește numărul de paranteze dreapta.

[7] Adăugare și căutare cuvânt – Proiectați o structură de date care acceptă următoarele două operații:

căutare (cuvânt) poate căuta un cuvânt literal sau un șir de expresii obișnuite care conține doar literele a-z sau ‘.’. Un „.” Înseamnă că poate reprezenta orice literă.

<

(https://leetcode.com/problems/add-and-search-word-data-structure-design/)

Abordare – Utilizați Trie comprimat (Arborele Radix)

[8] Numărul minim de opriri de realimentare – O mașină călătorește de la o poziție de plecare la o destinație care este „țintă” mile la est de poziția de plecare.

Pe parcurs, există benzinării. Fiecare stație [i] reprezintă o stație de benzină care este stații [i] [0] mile la est de poziția de plecare și are stații [i] [1] litri de gaz.

Mașina începe cu un rezervor infinit de gaz, care are inițial combustibil litri de combustibil în el. Folosește 1 litru de gaz pe 1 mile pe care îl conduce.

Când mașina ajunge la o benzinărie, aceasta se poate opri și alimenta cu combustibil, transferând tot gazul din stație în mașină.

Care este cel mai mic număr de opriri de realimentare pe care trebuie să le facă mașina pentru a ajunge la destinație? Dacă nu poate ajunge la destinație, returnați -1.

Rețineți că, dacă mașina ajunge la o benzinărie cu 0 combustibil rămas, mașina poate continua să alimenteze acolo. Dacă mașina ajunge la destinație cu 0 combustibil rămas, se consideră că a sosit.

Exemplu:

(https://leetcode.com/problems/minimum-number-of-refueling-stops/)

Abordare – Utilizați programarea dinamică pentru a calcula f [k] [i], adică cantitatea maximă de combustibil prezentă după ce k se oprește în stația I.

f [k] [i] = max (f [k-1] [0] – (stații [i] [0] -stări [0] [0]), f [k-1] [1] – (stații [i] [0] -stări [1] [0]), f [k-1] [2] – (stații [i] [0] -stări [2] [0]), …) + stații [i] [1]

[9] Cheie blocată – Având în vedere un dicționar de cuvinte valide, scrieți o funcție care acceptă un șir pentru a determina dacă șirul are o greșeală de eroare care este strict cauzată de o cheie blocată.

Exemplu:

Exemplu:

(https://leetcode.com/discuss/interview-question/679321/Google-or-Onsite-or-Determine-if-word-is-typo-because-of-stuck-key)

Utilizarea abordării bazate pe Trie.

[10] Săli de ședințe – Având o listă a întâlnirilor pentru o anumită zi într-un centru de conferințe, returnați o listă a intervalelor de timp în care se țin cel mai mare număr de întâlniri simultane.
Fiecare întâlnire are o oră de început ora de încheiere și ocupă o singură cameră într-un centru de conferințe.

Intrare:
(100.300) // întâlnire 1, 1:00 – 3:00

(145.215) // întâlnire 2
(200.230) // întâlnire 3
(215.300 ) // întâlnirea 4
(215.400) // ședința 5
(500.600) // ședința 6
(600.700) // ședința 7

Rezultat:
(215,230) // 4 întâlniri simultane: 1,3,4,5

(https://leetcode.com/discuss/interview-question/679396/Bloomberg-or-Onsite-or-Concurrent-Meetings)

Abordare – Sortează după orele de finalizare și folosește min-heap pentru a menține cea mai mică oră de finalizare curentă. Pentru fiecare întâlnire verificați dacă ora de început depășește sau este egală cu timpul minim de încheiere al întâlnirilor care rulează. Dacă este, atunci eliminați acea întâlnire din heap și adăugați această nouă întâlnire, altfel pur și simplu adăugați noua întâlnire.

Pentru întâlnirile maxime concurente, pentru fiecare oră de pornire, dacă este mai mică decât timpul minim curent al tuturor întâlnirilor care rulează, atunci intervalul [start_time, minimum_running_time] apare în toate întâlnirile care se desfășoară în prezent, adică lungimea heap-ului.

[11] Combinarea conturilor – având în vedere o listă de conturi, fiecare cont de element [i] este o listă de șiruri, în care primul cont de element [i] [0] este un nume, iar restul elementelor sunt e-mailuri reprezentând e-mailurile contului.

Acum, am dori să îmbinăm aceste conturi. Două conturi aparțin cu siguranță aceleiași persoane dacă există un e-mail comun pentru ambele conturi. Rețineți că, chiar dacă două conturi au același nume, acestea pot aparține unor persoane diferite, deoarece oamenii ar putea avea același nume. O persoană poate avea inițial orice număr de conturi, dar toate conturile sale au cu siguranță același nume.

După îmbinarea conturilor, returnați conturile în următorul format: primul element al fiecărui cont este numele, iar restul elementelor sunt e-mailuri în ordine sortată. Conturile în sine pot fi returnate în orice ordine.

Exemplu:

(https://leetcode.com/problems/accounts-merge/)

Abordare – Folosiți găsirea uniunii.