Skip to main content

3 načina da poboljšate rješenje za kodiranje intervjua - muza

(Bosnian) THRIVE: What on Earth Will It Take? (Lipanj 2026)

(Bosnian) THRIVE: What on Earth Will It Take? (Lipanj 2026)
Anonim

Dakle, tu ste. Laknulo. Iscrpljen. Napokon ste iznašli pristup za rješavanje škakljivog pitanja kodiranja koje vam postavlja vaš sugovornik. Možda ste to čak i napisali na ploči, red po redak. I dobro ste se proveli! Do sastanka ste tek 20 minuta. Tvoj ispitivač mora biti impresioniran.

Pravo?

"To će uspjeti, ali ima li ideja kako to učiniti učinkovitije?"

Srce vam tone. Mislili ste da ste gotovi sa škakljivim dijelom algoritma! Pokušavate smisliti više načina za rješenje problema, ali sve što možete smisliti je jedan pristup koji ste već smislili.

To se događa gotovo svima. I nije zato što su glupi. To je zato što većina ljudi nema metodu za poboljšanje učinkovitosti svojih algoritama.

Ali istina je da ih ima dosta. Sljedeći put kad vas netko zapne, pokušajte primijeniti ova tri uobičajena pristupa.

1. Koristite Hash kartu

Tako je. Karte sjeckanja / asocijativni nizovi / rječnici (nose se pod mnogim imenima, ovisno o tome koji programski jezik koristite) imaju čarobnu sposobnost smanjiti vrijeme izvođenja algoritama.

Na primjer, pretpostavimo da je pitanje bilo pronaći najčešće ponovljeni broj u nizu brojeva.

Vaša prva misao možda je skočiti u neke petlje. Za svaki naš broj smislite njegovo brojanje i provjerite je li najveći. Kako dolazimo do broja za svaki broj? Pregledajte niz, računajući koliko se puta dogodi! Dakle, govorimo o dvije ugniježđene petlje. U pseudo kodu:

def get_mode (nums): max_count = 0 mod = nula za potencijal_mode u brojevima: count = 0 za broj u našem_arrayu: count + = 1 ako broji> = max_count: mode = potencijal_mode max_count = računajući povratak

Trenutno pretražujemo čitav niz jednom za svaku stavku u polju - ali možemo i bolje. U velikoj O notaciji, ukupno je to vrijeme O (n 2 ).

Ako naše brojeve pohranimo u hash kartu (mapiranje brojeva s njihovim brojevima), problem možemo riješiti u samo jednom hodu nizom (O (n) vremena!):

def get_mode (nums): max_count = 0 mod = null counts = novi HashMap, započinjući svaku vrijednost sa 0 za potencijal_mode u brojevima: broji + = 1 ako broji> max_count: mode = potencijal_mode max_count = broji povratni način

Puno brže!

2. Koristite Bit manipulaciju

Ovo će vas stvarno razdvojiti od čopora. Ne odnosi se na svaki problem, ali ako ovo držite u stražnjem džepu i istrgnete ga u pravom trenutku, izgledat ćete kao rockstar.

Evo primjera: Pretpostavimo da smo imali niz brojeva, gdje se svaki broj pojavljuje dva puta, osim jednog broja koji se pojavljuje samo jedanput. Pišemo funkciju za pronalaženje usamljenog, neponovljenog broja.

Vaš bi prvi instinkt moglo biti korištenje hash karte, jer smo upravo razgovarali o tome. To je dobar instinkt! I uspjet će za ovaj. Možemo napraviti vrlo sličnu kartu brojanja i upotrijebiti je da vidimo koji broj se završava brojem 1.

Ali postoji još bolji način. Ako znate malo manipulacije, možda ćete biti upoznati s XOR-om. Ono što je posebno kod XOR-a jest to da ako XOR brojkate sa sobom, bitovi se "ponište" na 0. Za ovaj problem, ako XOR svaki broj zajedno u nizu, ostat ćemo s jednim brojem koji nije ne otkazujem:

def find_unrepepeated (nums): neponovljeno = 0 za num u brojevima: neponovljeno = neponovljeno XOR vraćanje broja ponovljeno

3. Idite odozdo prema gore

Napisati funkciju koja proizvodi „n“ Fibonaccijev broj, s obzirom na broj n. Ovaj je klasik i vrlo se lijepo podnosi rekurziji:

def fib (n): ako je n 0 ili 1: vratite 1 povratnu fib (n-1) + fib (n-2)

Ali jednostavan rekurzivni odgovor nije jedini! Dobro razmislite što ova funkcija radi. Pretpostavimo da je n 5. Da biste dobili odgovor, rekurzivno poziva fib (4) i fib (3). E sad, što radi taj poziv fib (4)? Zove fib (3) i fib (2). Ali samo smo rekli da već imamo poziv za fib (3)! Ova simpatična rekurzivna funkcija radi puno ponavljanja. Ispada da je ukupni trošak vremena O (2 n ). To je loše - mnogo gore od O (n 2 ).

Umjesto da se s n rekurzivno krećemo prema 1, idemo "odozdo prema gore", od 1 do n. To nam omogućuje preskočiti rekurziju:

def fib (n): prethodni = 0 prethodni_previdni = 1 za i u rasponu od 1 do n: trenutni = prethodni + prethodni_pregledni prethodni_previdni = prethodni prethodni = trenutni povratni tok

Kod je duži, ali je mnogo učinkovitiji! Dole do O (n) vremena. Kao dodatni bonus s razvlačenjem rekurzivnih algoritama, štedimo prostor. Svi ti rekurzivni pozivi stvaraju se u skupu poziva, koji sjedi u sjećanju i broji naše troškove prostora. Naša rekurzivna funkcija imala je O (n) trošak prostora, ali ova iterativna zauzima O (1) prostor.

Sljedeći put kad vas sugovornik zatraži da poboljšate efikasnost svog rješenja, pokušajte proći kroz te strategije i vidjeti hoće li oni pomoći. Uz dovoljno prakse, vjerojatno ćete se naći ravno u optimiziranom rješenju, preskačući naivnija rješenja. I to je sjajna stvar. To ne znači samo da postajete bolji anketar - to znači da postajete i bolji inženjer.