Skip to main content

3 būdai, kaip patobulinti jūsų kodavimo interviu sprendimą - mūza

Anonim

Taigi jūs esate. Atleido. Išsekęs. Pagaliau sugalvojai išspręsti keblų kodavimo klausimą, kurio tau užduoda interviu. Galbūt jūs net parašėte tai ant lentos, eilutę po eilutės. Ir jūs gerai praleidote laiką! Jūs esate tik 20 minučių į susitikimą. Jūsų pašnekovas turi būti sužavėtas.

Teisingai?

„Tai veiks, bet ar turite idėjų, kaip tai padaryti efektyviau?“

Tavo širdis liejasi. Manėte, kad atlikote keblią algoritmo projektavimo dalį! Bandate galvoti apie daugiau būdų, kaip išspręsti problemą, tačiau viskas, apie ką galite galvoti, yra tas požiūris, kurį jau sugalvojote.

Tai atsitinka beveik visiems. Ir ne todėl, kad jie kvaili. Taip yra todėl, kad dauguma žmonių neturi savo algoritmų efektyvumo didinimo metodo.

Tačiau tiesa yra, kad jų yra daugybė. Kitą kartą, kai būsite užkluptas, pabandykite taikyti šiuos tris įprastus metodus.

1. Naudokite maišos žemėlapį

Teisingai. Maišymo žemėlapiai / asociatyvūs matricos / žodynai (jie pateikiami daugybe pavadinimų, atsižvelgiant į tai, kokią programavimo kalbą naudojate) turi magišką galimybę sutrumpinti algoritmų veikimo laiką.

Pavyzdžiui, tarkime, kad klausimas buvo rasti daugiausiai pasikartojančių skaičių iš skaičių masyvo.

Pirma jūsų mintis gali būti peršokimas į kai kurias kilpas. Išsiaiškinkite kiekvieno mūsų skaičiaus skaičių ir pažiūrėkite, ar jis yra didžiausias. Kaip gauti kiekvieno skaičiavimo skaičių? Peržiūrėkite masyvą, skaičiuodami, kiek kartų jis įvyksta! Taigi mes kalbame apie dvi įdėtas kilpas. Pseudokode:

def get_mode (skaičiai): max_count = 0 mode = null for potencial_mode in nums: count = 0 skaičiui our_array: count + = 1 jei count> = max_count: mode = potencialus_mode max_count = count grąžos režimas

Šiuo metu mes žiūrime per visą savo masyvą kiekvieną masyvo elementą, bet mes galime padaryti geriau. Dideliu O žymėjimu iš viso tai yra O (n 2 ) laikas.

Jei kaupsime savo duomenis maišos žemėlapyje (suskaičiuodami skaičius pagal jų skaičių), problemą galėsime išspręsti per vieną ėjimą per masyvą (O (n) laiko!):

def get_mode (skaičius): max_count = 0 mode = null counts = new HashMap, pradedant kiekvieną vertę nuo 0 potencialo modeliui sumose: skaičiuojama + = 1, jei skaičiuojama> max_count: mode = potenciali_mode max_count = skaičiuojama grąžinimo būsena

Daug greičiau!

2. Naudokite bitų manipuliavimą

Tai tikrai išskirs jus iš pakuotės. Tai netaikoma kiekvienai problemai, tačiau jei laikysite tai savo užpakalinėje kišenėje ir išmesite tinkamu metu, atrodysite kaip rokeris.

Štai pavyzdys: Tarkime, kad mes turėjome skaičių masyvą, kur kiekvienas skaičius rodomas du kartus, išskyrus vieną numerį, kuris atsiranda tik vieną kartą. Mes rašome funkciją, kad surastume vienišą, nesikartojantį numerį.

Pirmasis jūsų instinktas gali būti maišos žemėlapio naudojimas, nes mes ką tik apie tai kalbėjome. Tai geras instinktas turėti! Ir tai veiks šiam. Galime sudaryti labai panašų „skaičiuojamąjį“ žemėlapį ir naudoti jį norėdami pamatyti, kuris skaičius baigiasi skaičiumi 1.

Tačiau yra dar geresnis būdas. Jei esate susipažinęs su bitų manipuliavimu, galbūt esate susipažinęs su XOR. Vienas ypatingas XOR dalykas yra tai, kad jei XOR numetate sau skirtą numerį, bitai „atšaukia“ iki 0. Dėl šios problemos, jei mes XOR kiekvieną skaičių masyve kartu, mes paliksime vieną numerį, kuris nepadarė neatšaukti:

def rasti_nekartotas (skaičius): nekartojamas = 0 skaičiui skaičiais išreikšti: nekartotas = nekartotas XOR num grąžinimas pakartotas

3. Eik iš apačios į viršų

Parašykite funkciją, kuri išveda „n-tąjį“ Fibonacci numerį, kuriam suteiktas skaičius n. Tai klasika, ir ji labai gražiai pasikartoja:

def fib (n): jei n yra 0 arba 1: grąžinkite 1 grįžtamąjį fib (n-1) + fib (n-2)

Tačiau paprastas pasikartojantis atsakymas nėra vienintelis! Gerai pagalvokite, ką ši funkcija atlieka. Tarkime, kad n yra 5. Norėdami gauti atsakymą, jis rekursyviai vadina fib (4) ir fib (3). Ką daro tas skambutis į fib (4)? Tai vadina fib (3) ir fib (2). Bet mes tik pasakėme, kad jau turime skambutį į fib (3)! Ši miela pasikartojanti funkcija atlieka daug pakartotinių darbų. Pasirodo, kad visos laiko sąnaudos yra O (2 n ). Tai blogai - daug blogiau nei O (n 2 ).

Užuot ėję nuo n rekursyviai žemyn iki 1, eikime „iš apačios į viršų“ nuo 1 iki n. Tai leidžia mums praleisti rekursiją:

def fib (n): ankstesnis = 0 ankstesnis_iš anksto = 1 i intervale nuo 1 iki n: dabartinė = ankstesnė + ankstesnė_ ankstesnė ankstesnė_ ankstesnė = ankstesnė ankstesnė = dabartinė grįžtamoji srovė

Kodas yra ilgesnis, tačiau jis yra daug efektyvesnis! Iki O (n) laiko. Kaip papildoma premija su išvyniojamųjų rekursinių algoritmų taupymu, sutaupome vietos. Visi tie pasikartojantys skambučiai kaupiasi skambučių kamino, kuris įsimenamas atmintyje ir įskaičiuojamas į mūsų vietos kainą. Mūsų rekursinė funkcija turėjo O (n) vietos kainą, tačiau ši kartotinė užima O (1) vietą.

Kitą kartą jūsų pašnekovas paprašys jūsų pagerinti savo sprendimo efektyvumą, pabandykite pereiti šias strategijas ir pažiūrėti, ar jos padeda. Turėdami pakankamai praktikos, tikriausiai pamatysite, kad einate tiesiai prie optimizuoto sprendimo, praleisdami naivesnį sprendimą. Ir tai yra puikus dalykas. Tai nereiškia, kad tampi geresniu pašnekovu - tai reiškia, kad tampi geresniu inžinieriumi.