Skip to main content

3 Tapaa koodaushaastatteluratkaisusi parantamiseksi - muse

3 TAPAA PARANTAA TASAPAINOA KAHVAKUULALLA (Kesäkuu 2025)

3 TAPAA PARANTAA TASAPAINOA KAHVAKUULALLA (Kesäkuu 2025)
Anonim

Joten siellä olet. Helpottunut. Uupunut. Olet vihdoin keksinyt lähestymistavan ratkaista haastava koodauskysymys, jonka haastattelijasi kysyy. Ehkä kirjoitit sen jopa taululle rivi riviltä. Ja teit hyvää aikaa! Olet vain 20 minuuttia kokouksesta. Haastattelijan täytyy olla vaikuttunut.

Oikea?

"Tämä toimii, mutta onko ideoita kuinka tehdä se tehokkaammin?"

Sydämesi uppoaa. Luulit, että olet valmis hankaliin algoritmien suunnitteluosuuksiin! Yrität miettiä enemmän tapoja ratkaista ongelma, mutta voit ajatella vain yhden tavan, jonka olet jo keksinyt.

Näin tapahtuu melkein kaikille. Ja se ei johdu siitä, että he ovat tyhmiä. Se johtuu siitä, että useimmilla ihmisillä ei ole menetelmää algoritmiensa tehostamiseksi.

Mutta totuus on, että niitä on paljon. Seuraavan kerran, kun olet kanssa, kokeile näitä kolmea yleistä lähestymistapaa.

1. Käytä hash-karttaa

Oikein. Hash-kartat / assosiatiiviset taulukot / sanakirjat (ne kulkevat monilla nimillä käyttämästäsi ohjelmointikielestä riippuen) omaavat maagisen kyvyn vähentää algoritmien ajonaikaa.

Oletetaan esimerkiksi, että kysymys oli löytää useimmin toistuva luku numerojoukosta.

Ensimmäinen ajatuksesi saattaa olla hypätä joihinkin silmukoihin. Selvitä jokaisen numeromme lukumäärä ja katso onko se suurin. Kuinka saamme lukumäärän jokaiselle numerolle? Siirry taulukon läpi laskemalla kuinka monta kertaa se tapahtuu! Joten puhumme kahdesta sisäkkäisestä silmukasta. Pseudokoodissa:

def get_mode (luvut): max_count = 0 mode = nolla potencial_mode in sum: count = 0 numeroon meidän_matriisissa: count + = 1 jos count> = max_count: mode = potencial_mode max_count = count return mode

Tällä hetkellä etsimme koko joukkoamme kerran jokaisesta ryhmän tuotteesta - mutta voimme tehdä paremmin. Suuressa O-merkinnässä se on yhteensä O (n 2 ) -aika.

Jos tallennamme laskemme hash-karttaan (kartoittamalla numerot niiden määrään), voimme ratkaista ongelman vain yhdellä kävelyllä taulukon läpi (O (n) aika!):

def get_mode (luvut): max_count = 0 mode = null counts = new HashMap, jokainen arvo alkaa 0: lla potencial_mode summissa: laskee + = 1, jos laskee> max_count: mode = potencial_mode max_count = laskee palautustilan

Paljon nopeampi!

2. Käytä bitin manipulointia

Tämä erottaa sinut todella pakkauksesta. Se ei koske kaikkia ongelmia, mutta jos pidät tämän takataskussa ja purkaat sen ulos oikeaan aikaan, näytät siltä kuin rockstar.

Tässä on esimerkki: Oletetaan, että meillä oli joukko numeroita, joissa jokainen numero esiintyy kahdesti, lukuun ottamatta yhtä numeroa, joka esiintyy vain kerran. Kirjoitamme funktion löytää yksinäinen, toistamaton numero.

Ensimmäinen vaisto voi olla käyttää hash-karttaa, koska puhuimme juuri siitä. Se on hyvä vaisto saada! Ja se toimii tässä. Voimme tehdä hyvin samanlaisen “laskee” -kartan ja käyttää sitä nähdäksesi mikä numero päättyy lukemaan 1.

Mutta siellä on vielä parempi tapa. Jos tunnet bittikäsittelyn, saatat tuntea XOR: n. Yksi asia, joka on erityinen XOR: ssa, on se, että jos XOR-numero on itsessään, bitit “peruutetaan” nollaan. Tätä ongelmaa varten, jos XOR-merkitsemme jokaista taulukossa olevaa numeroa yhdessä, meillä on yksi numero, joka ei et peruuta:

def löytää_toistamaton (lukumäärä): toistamaton = 0 numeroille numeroissa: toistamaton = toistamaton XOR-num-paluu toistamaton

3. Mene ylöspäin

Kirjoita funktio, joka tuottaa n: nnen Fibonacci-numeron, jolle annetaan numero n. Tämä on klassikko, ja se soveltuu erittäin hienosti rekursioon:

def fib (n): jos n on 0 tai 1: paluu 1 paluu fib (n-1) + fib (n-2)

Mutta yksinkertainen rekursiivinen vastaus ei ole ainoa! Ajattele huolellisesti, mitä tämä toiminto tekee. Oletetaan, että n on 5. Vastauksen saamiseksi se kutsuu rekursiivisesti fib (4) ja fib (3). Nyt mitä tuo kutsu (fib) (4) tekee? Sitä kutsutaan fib (3) ja fib (2). Mutta sanoimme juuri, että meillä oli jo puhelu fib (3)! Tämä söpö rekursiivinen toiminto tekee paljon toistuvaa työtä. Aikakustannusten kokonaismäärä osoittautuu O (2 n ). Se on huonoa - paljon pahempaa kuin O (n 2 ).

Sen sijaan, että siirryttäisiin n: stä rekursiivisesti alaspäin 1: een, siirrytään “alhaalta ylös” -kohtaan 1: stä n: ään. Tämän avulla voimme ohittaa rekursion:

def fib (n): edellinen = 0 edellinen_todellinen = 1 i: lle välillä 1 - n: nykyinen = edellinen + edellinen_edellinen edellinen_todellinen = edellinen edellinen = nykyinen paluuvirta

Koodi on pidempi, mutta se on paljon tehokkaampi! Aika O (n) -aikaan. Lisäbonuksena, jossa on rekursiivisten algoritmien rullaus, säästämme tilaa. Kaikki nämä rekursiiviset puhelut kertyvät puhepinoon, joka mahtuu muistiin ja laskee tilakustannuksemme. Rekursiivisella funktiollamme oli O (n) avaruuskustannukset, mutta tämä iteratiivinen vie O (1) -tilan.

Seuraavan kerran, kun haastattelijasi pyytää sinua parantamaan ratkaisusi tehokkuutta, kokeile näitä strategioita ja katso, auttavatko ne. Kun sinulla on riittävästi harjoittelua, huomaat todennäköisesti siirtyvän suoraan optimoituun ratkaisuun, ohittaen naivemman ratkaisun. Ja se on hieno asia. Se ei tarkoita vain, että sinusta tulee parempi haastattelija - se tarkoittaa, että sinusta tulee parempi insinööri.