de Sun-Li Beatteay

Cum să abordați orice interviu de codificare fără a intra în panică

Cum sa abordati orice interviu de algoritm fara a intra

Să fim sinceri, problemele algoritmice fac încă o mare parte din căutarea unui loc de muncă. În timp ce există un listă în continuă expansiune a companiilor care nu te fac să sari prin cercuri de codificare, dezvoltatorul mediu va întâmpina o provocare live de algoritm cândva în căutarea locului de muncă. Mai ales dacă doriți să lucrați pentru un Big Four sau un startup consacrat. Așa că prin cercuri sărim.

Nu trebuie să vorbesc despre cât de stresante pot fi interviurile tehnice. Sunt sigur că majoritatea dintre noi știm frustrarea ieșirii dintr-un interviu pe care tocmai l-am bombardat și a mers cu bicicleta prin toate modurile în care am fi putut-o întoarce. Nu este un sentiment distractiv.

De aceea scriu asta. Pentru aceia dintre voi care ajung într-o provocare algoritmică, modul în care o abordați poate face diferența. Sunteți tipul de persoană care se aruncă cu capul în primul rând și își dă seama pe parcurs? Sau aveți un proces pe care îl urmați pentru a descompune problema în bucăți gestionabile? În timp ce prima metodă poate funcționa pentru unii, eu o exercitez pe cea din urmă.

Pentru mine este esențial să ai un set de pași pentru a rezolva o problemă. Deși nu-mi garantează o soluție sau o ofertă de muncă, îmi permite să gestionez răspunsul la stres. Menținerea panicii la un nivel tolerabil mă ajută să mă concentrez. La urma urmei, interviurile tehnice ar trebui să fie despre demonstrarea abilității dvs. de a rezolva problemele – nu a abilității dvs. de a gestiona mai mulți oameni care vă judecă în tăcere fără a vă pierde.

În acest articol, vreau să vă arăt procesul pe care l-am perfecționat prin mai multe ecrane tehnice și zeci de interviuri simulate. Este puternic influențat de Lansați sistemul PEDAC al școlii. Îl folosesc de fiecare dată și mi-a servit bine.

„Îndrăgostește-te de proces și rezultatele vor veni.” – Eric Thomas

Cel mai bun mod de a-mi arăta procesul este să-l demonstrez în acțiune. Deci, să rezolvăm împreună o problemă. Și pentru a face acest lucru cât mai autentic posibil, voi alege o problemă pe care nu am rezolvat-o niciodată. Deși va trebui să mă crezi pe cuvânt.

Conform Leetcode, String to Integer algoritmul este o întrebare de interviu populară. De asemenea, are cea mai mică rată de finalizare a oricărei probleme de clasare medie. Aceasta ar trebui să fie o provocare bună.

De asemenea, am ales această problemă, deoarece este oarecum practică. Acesta este un algoritm real care a fost implementat în majoritatea limbajelor de programare. Spre deosebire de multe alte provocări ale interviului (uitându-te la tine Schimbarea monedei), inginerii au folosit de fapt acest algoritm în viața reală.

Acestea fiind spuse, hai să ne scufundăm. Simțiți-vă liber să urmați în orice limbă doriți. Voi folosi JavaScript. Puteți să încercați abordarea mea sau să o folosiți pe a voastră. Vedeți dacă puteți chiar să o rezolvați înainte să o fac la sfârșitul acestei postări. S-ar putea să ajungeți cu un pas mai aproape de crearea propriei limbi.

Pasul 1: reformulați problema în propriile cuvinte

0*RLFsUv1fOvXw5omy

Pentru mine, acesta este cel mai important pas. Aceasta este șansa mea de a-mi pune întrebările intervievatorului pentru a clarifica cerințele și a analiza toate informațiile cruciale. Mai mult, rescrierea problemei în cuvintele mele îmi oferă șansa de a forma un model mental și de a digera problema.

Pentru această problemă, o întrebare pe care aș pune-o este dacă am voie să folosesc turnarea de tip. În timp ce descrierea nu o specifică, voi folosi doar castingul de tip nativ JavaScript pentru a converti câte un caracter la rând. Acesta este genul de restricție pe care m-aș aștepta să o găsesc într-un interviu propriu-zis.

După citirea descrierii, acestea sunt detaliile cheie cu care am venit.

// Given a string, return its appropriate number value.
// Ignore all white-space at the beginning of the string.
// Number may begin with a negative or positive.
// All characters that come after the number should be ignored.
// String is invalid if a character that is not a white-space or sign comes before the number.
// If string does not contain any integer values, it is invalid.
// The return value for any invalid string is 0.
// Resulting integer cannot be larger than (2^31) — 1 or smaller than -(2^31).

Doar din aceste cerințe, încep deja să-mi imaginez cum voi crea acest algoritm. Probabil va necesita o buclă și o logică condițională.

Unii oameni ar începe probabil să codeze după acest pas. Pentru mine, este încă un pic prea devreme pentru a formula orice planuri concrete – dar treptele mele se întorc.

Pasul 2: Tipuri de intrare și ieșire

Mulți oameni vor vedea acest lucru ca pe un pas inutil, dar mă asigur întotdeauna că primesc intrările și ieșirile algoritmului. Fie ca un comentariu de cod, fie în colțul tablei.

Acesta are două funcții. În primul rând, solidifică care vor fi parametrii funcției mele și cum va arăta semnătura. Leetcode a creat deja semnătura funcției pentru mine, dar acest lucru nu va fi cazul într-un interviu propriu-zis.

În al doilea rând, păstrez un memento cu tipurile cu care voi lucra. Nu este nemaiauzit ca un candidat să eșueze toate cazurile de testare pentru că a uitat să returneze un șir și nu un tablou. Pot să vorbesc sau nu din experiență …

Pentru problema noastră, intrările și ieșirile sunt bine definite în titlu.

Input: stringOutput: 32-bit signed integerSignature: myAtoi(str)

Pasul 3: Exemple și cazuri Edge

Cum sa abordati orice interviu de algoritm fara a intra

Acum, că am încredere în intrări și ieșiri, vreau să vin cu câteva cazuri de testare. Aceste exemple trebuie să acopere toate cazurile marginale la care mă pot gândi. Îmi pot imagina de câte ori un candidat a creat o soluție de lucru, doar pentru ca intervievatorul să vină cu un caz de margine pe care l-au ratat – determinând soluția lor să se destrame.

Este posibil ca intervievatorul dvs. să vă ofere unele, dar aș veni și cu mai multe – mai ales dacă nu sunt exhaustive. De exemplu, Leetcode mi-a oferit câteva cazuri de testare decente.

In: “4193 with words”Out: 4193
In: “words and 987”Out: 0
In: “-91283472332”Out: -2147483648

Cu toate acestea, acestor exemple lipsesc unele posibilități. Ce se întâmplă dacă numărul începe cu a +? Sau ce se întâmplă dacă mai multe semne apar înaintea unui număr, cum ar fi -+-50?

Să facem unele mai bune.

Input: “+50.890”Output: 50
Input: “ -+100”Output: 0
Input: “ !another invalid -10”Output: 0

Pasul 4: Structuri de date

1611038828 65 Cum sa abordati orice interviu de algoritm fara a intra

Majoritatea, dacă nu toate, provocările codului algoritmului implică utilizarea unei structuri pentru a vă urmări datele. Este important să luați în considerare structurile de date pe care le veți utiliza, deoarece acestea vor avea impact asupra implementării dvs.

Știu din descrierea problemei că voi avea de-a face cu șiruri și numere întregi. Dar voi folosi o altă structură de date pentru a ajuta la conversia de la una la alta?

O problemă pe care o pot prevedea deja este urmărirea locurilor fiecărei cifre (zeci, sute, mii etc.). Deoarece nu voi cunoaște în prealabil lungimea întregului meu, voi folosi un matrice pentru a urmări caracterele întregi. Matricea va servi drept substituent intermediar pentru fiecare caracter înainte de a fi convertite în întregul final.

Deși există cel mai probabil o soluție mai eficientă din punct de vedere spațial, pot optimiza soluția mea mai târziu. În acest moment, vreau doar să merg cu ceea ce are cel mai mult sens pentru mine. Este mai bine să obțineți o soluție naivă funcțională decât să trageți spre lună și să nu terminați nimic.

Pasul 5: Pseudocod

1611038828 913 Cum sa abordati orice interviu de algoritm fara a intra

Penultimul meu pas este să petrec ceva timp prezentându-mi algoritmul în pseudocod. Intervievatorii vor să vadă cum gândești și cum abordezi problemele. Pseudocodul este perfect pentru asta.

Un avantaj suplimentar este că intervievatorul va ști cum să vă ajute din timp. Au fost momente în care m-am blocat pe o problemă doar pentru ca intervievatorul meu să ofere indicii subtile pentru a mă continua. Dacă săriți în codificare fără un plan, ați putea ajunge să vă derutați atât pe voi, cât și pe intervievatorul dvs. Faceți-vă fiecare o favoare și creați un plan de acțiune.

Asta am venit cu mine.

// Start with index = 0
// While character at current index is white-space  // increment index
// Check if next character is invalid  // return 0
// Check if next character is positive or negative sign  // If negative sign, mark number as negative  // increment index
// Loop through characters starting at current index  // If current character is integer    // Unshift into front of array    // Increment index  // Else, break out of loop
// Loop through string integer array   // Cast string character into integer  // Multiply integer by (10^index) and add to return value
// If string contained negative sign, multiply result value by -1// If result value is less than min, reassign to min// If result value is greater than max, reassign to max
// return value

S-ar putea să pară că am venit cu asta de nicăieri, dar au existat multe deliberări și încercări și erori în culise. Acesta este pasul care consumă mult timp, deoarece aici este creat algoritmul.

Citiți cerințele, intrările / ieșirile și cazurile marginale. Puneți întrebări, clarificați concepte și izolați zonele de incertitudine pe care să vă concentrați. Găsiți cea mai simplă soluție la care vă puteți gândi și lucrați de acolo.

Vei avea nevoie de o căutare în profunzime? Fereastra glisanta? Diviza și cuceri? Altceva?

Dacă acesta este pasul cu care te lupți cel mai mult, nu-ți face griji. Va deveni mai ușor cu practica. Și ar trebui să exersezi. Un design complet al algoritmului în pseudocod va face următorul pas rapid și ușor.

Pasul 6: Cod!

In cele din urma!”Probabil că te gândești. „Asta a durat pentru totdeauna!

Într-adevăr, îmi petrec mult timp în planificarea dispoziției. Dacă un intervievator îmi dă 45 de minute pentru a termina, voi petrece 15-30 de minute gândindu-mă și digerând mental.

„Dă-mi șase ore să tăiem un copac și le voi petrece pe primele patru ascuțind toporul.” – Abraham Lincoln

De fapt, codificarea este cel mai puțin important pas pentru mine. Toate ridicările grele s-au făcut deja. Acum trebuie doar să-mi interpretez modelul mental în cod.

În plus, modul în care codez această soluție într-un set de interviu nu va fi același cu modul în care o codez în viața reală. Heck, o soluție reală de interviu ar arăta diferit de răspunsul cu care am venit pentru acest articol. Mai mulți factori afectează modul în care codific într-un interviu, cum ar fi timpul și capacitatea de răspuns a intervievatorului.

Fără acces la Google sau suficient timp pentru refactorizare, vreau doar să scriu ceva care funcționează. Și nu există nicio garanție că aș realiza chiar asta.

Dar nu acesta este scopul acestei postări. Da, este posibil să nu fi rezolvat această întrebare într-un interviu. Dar până în acest moment, am structurat provocarea în componentele sale cheie. știu că eu poate sa rezolv-o și m-am pus în cea mai bună poziție pentru a face acest lucru. Un intervievator bun va vedea asta.

Într-un ecran tehnic sau la fața locului, nu este vorba despre cod. Așa ai venit cu asta.

Dacă sunteți interesat să comparați soluții, iată-l pe cel cu care am venit:

Această soluție nu este cea mai eficientă. Potrivit Leetcode, depășește doar 25% din celelalte trimiteri.

1611038828 546 Cum sa abordati orice interviu de algoritm fara a intra

Cu toate acestea, ar trece cele mai multe interviuri tehnice. Un intervievator mi-ar putea cere să-l optimizez pentru spațiu sau timp, dar acestea sunt lucruri care pot fi incluse pe iterații ulterioare dacă timpul o permite. Nu trebuie să veniți cu ei la prima încercare.

Scopul utilizării unui proces este de a avea o abordare sistemică pentru a sparge orice provocare. Funcționează indiferent dacă îl folosiți zilnic sau în cadrul unui interviu tehnic. Folosindu-l într-un interviu, vă puteți ține panica la distanță concentrându-vă asupra provocării și nu a emoțiilor voastre.

Dacă nu aveți un proces, începeți să faceți unul. Poți să folosești PEDAC sau dezvoltă-ți propriul. Asigurați-vă că vă ajută să creați soluții în care aveți încredere.

De exemplu, este posibil să fi observat utilizarea de constante, funcții de ajutor și regex în soluția mea. Acestea sunt toate trucuri pe care le-am luat și care mă ajută să izolez complexitatea într-un interviu. Cu cât codul meu citește mai mult ca limba engleză, cu atât mă confund mai puțin atunci când îl scriu și lucrez mai repede. Poate că este cam detaliat, dar îmi place. Fă ceea ce funcționează pentru tine.

Dacă există deja o procedură pe care o utilizați, exersați-o și perfecționați-o. Nu așteptați până la interviu la fața locului pentru a începe reglarea fină. Experimentați în interviuri simulate. Pramp și Interviewing.io sunt instrumente perfecte pentru asta.

Amintiți-vă, dacă toate celelalte nu reușesc, aveți încredere în proces.

Dacă acest articol a rezonat cu dvs., vă rugăm să lăsați câteva palme? !

Ca întotdeauna, codificare fericită!