Skip to main content

3 veidi, kā uzlabot kodēšanas intervijas risinājumu - mūza

Anonim

Tātad tur jūs esat. Atvieglots. Izsmelts. Jūs beidzot esat nācis klajā ar pieeju, kā atrisināt sarežģīto kodēšanas jautājumu, kuru jums uzdod intervētājs. Iespējams, ka jūs to pat uzrakstījāt uz tāfeles pa rindām. Un jūs labi nodarbojāties! Jūs esat tikai 20 minūtes sapulcē. Jūsu intervētājs būs jāatstāj pārsteigums.

Pa labi?

"Tas darbosies, bet vai ir kādas idejas, kā to izdarīt efektīvāk?"

Tava sirds grimst. Jūs domājāt, ka esat pabeidzis ar sarežģīto algoritma dizaina daļu! Jūs mēģināt domāt par vairākiem veidiem, kā atrisināt problēmu, taču viss, par ko jūs varat domāt, ir tā pieeja, kuru jūs jau esat nācis klajā.

Tas notiek gandrīz ar visiem. Un tas nav tāpēc, ka viņi ir stulbi. Tas ir tāpēc, ka lielākajai daļai cilvēku nav metodes savu algoritmu efektivitātes uzlabošanai.

Bet patiesība ir tāda, ka to ir daudz. Nākamreiz, kad būsit paklupis, mēģiniet izmantot šīs trīs izplatītās pieejas.

1. Izmantojiet Hash karti

Tieši tā. Kratīšanas kartēm / asociatīvajiem masīviem / vārdnīcām (tām ir daudz vārdu, atkarībā no tā, kuru programmēšanas valodu jūs izmantojat) piemīt maģiska spēja samazināt algoritmu izpildes laiku.

Piemēram, pieņemsim, ka jautājums bija atrast skaitļu masīvā visatkārtotākos skaitļus.

Jūsu pirmā doma varētu būt ielēkt dažās cilpās. Izdomājiet katra numura skaitli un pārbaudiet, vai tas ir lielākais. Kā iegūt skaitli par katru numuru? Pārliecinieties par masīvu, saskaitot, cik reizes tas notiek! Tātad, mēs runājam par divām ligzdotām cilpām. Pseidokodā:

def get_mode (skaitļi): max_count = 0 mode = null for potencial_mode in sum: count = 0 skaitlim our_array: count + = 1, ja count> = max_count: mode = potencial_mode max_count = count return mode

Pašlaik mēs katru reizi aplūkojam visu masīvu katram masīva vienumam, bet mēs varam darīt labāk. Lielā O piezīmē tas ir kopā O (n 2 ) laiks.

Ja savus skaitļus glabājam hash kartē (skaitļu kartēšana pēc to skaita), problēmu varam atrisināt tikai vienā gājienā pa masīvu (O (n) laiks!):

def get_mode (skaitļi): max_count = 0 mode = null counts = new HashMap, katru vērtību sākot ar 0 potenciālajai_mode summai: skaita + = 1, ja skaita> max_count: mode = potencial_mode max_count = counts return mode

Daudz ātrāk!

2. Izmantojiet bitu manipulācijas

Tas jūs tiešām atšķir no iepakojuma. Tas neattiecas uz katru problēmu, bet, ja jūs to glabājat aizmugurējā kabatā un īstajā laikā izsvītrojat, jūs izskatīsities kā rokstains.

Šis ir piemērs: Pieņemsim, ka mums bija ciparu masīvs, kur katrs skaitlis parādās divreiz, izņemot vienu numuru, kas notiek tikai vienreiz. Mēs rakstām funkciju, lai atrastu vientuļu, neatkārtotu numuru.

Jūsu pirmais instinkts varētu būt hash kartes izmantošana, jo mēs tikko par to runājām. Tas ir labs instinkts! Un tas derēs šim. Mēs varam izveidot ļoti līdzīgu “skaitīšanas” karti un izmantot to, lai redzētu, kurš skaitlis beidzas ar skaitli 1.

Bet ir vēl labāks veids. Ja esat pazīstams ar bitu manipulācijām, iespējams, esat pazīstams ar XOR. Viena lieta, kas XOR ir īpaša, ir tā, ka, ja jūs XOR skaitlis pats ar sevi, biti “atceļ” līdz 0. Šai problēmai, ja mēs XOR katru masīva numuru kopā, mēs paliksim viens numurs, kurš neatceļ:

def atrast_neatkārtots (skaitļi): neatkārtots = 0 skaitlim skaitļos: neatkārtots = neatkārtots XOR num atgriešanās neatkārtots

3. Iet uz augšu

Uzrakstiet funkciju, kas izvada “n” Fibonači skaitli, kuram ir skaitlis n. Šī ir klasika, un to ļoti labi var izmantot rekursijai:

def fib (n): ja n ir 0 vai 1: atgriezt 1 atgriešanās fib (n-1) + fib (n-2)

Bet vienkāršā rekursīvā atbilde nav vienīgā! Rūpīgi pārdomājiet, ko šī funkcija veic. Pieņemsim, ka n ir 5. Lai iegūtu atbildi, tas rekursīvi izsauc fib (4) un fib (3). Ko tas zvans uz fib (4) dara? Tas sauc par fib (3) un fib (2). Bet mēs tikko teicām, ka mums jau ir zvans uz fib (3)! Šī jaukā rekursīvā funkcija veic daudz atkārtotu darbu. Kopējās laika izmaksas izrādās O (2 n ). Tas ir slikti - daudz sliktāk nekā O (n 2 ).

Tā vietā, lai pārietu no n rekursīvi uz leju līdz 1, iesim “no apakšas uz augšu” no 1 līdz n. Tas ļauj mums izlaist rekursiju:

def fib (n): iepriekšējais = 0 iepriekšējais_uzdevums = 1 attiecībā uz i diapazonā no 1 līdz n: pašreizējais = iepriekšējais + iepriekšējais_uzņemtais iepriekšējais_uzņemtais = iepriekšējais iepriekšējais = pašreizējais atgriešanās strāva

Kods ir garāks, bet tas ir daudz efektīvāks! Līdz O (n) laikam. Kā papildu bonuss ar rekursīvo algoritmu atritināšanu mēs ietaupām vietu. Visi šie rekursīvie zvani uzkrājas sarunu kaudzē, kas paliek atmiņā un tiek ņemta vērā mūsu kosmosa izmaksās. Mūsu rekursīvajai funkcijai bija O (n) telpas izmaksas, bet šī iteratīvā ņem O (1) vietu.

Nākamreiz, kad jūsu intervētājs lūgs jums uzlabot jūsu risinājuma efektivitāti, mēģiniet iziet cauri šīm stratēģijām un pārliecināties, vai tās palīdz. Pietiekami daudz praktizējot, jūs, iespējams, atradīsities tieši pie optimizētā risinājuma, izlaižot naivāku risinājumu. Un tā ir lieliska lieta. Tas nenozīmē tikai to, ka jūs kļūstat labāks intervētājs - tas nozīmē, ka jūs kļūstat labāks inženieris.