Skip to main content

3 maneres de millorar la vostra solució d'entrevista de codificació: la musa

Anonim

Així que hi esteu Alleujat Esgotat Finalment, heu arribat a plantejar-vos una solució per resoldre la difícil pregunta de codificació que us planteja el vostre entrevistador. Potser fins i tot ho heu escrit a la pissarra, línia per línia. I t’ho vas passar bé! Ets a només 20 minuts de la reunió. El vostre entrevistador ha de quedar impressionat.

Dret?

"Funcionarà, però hi ha alguna idea de com fer-ho de manera més eficient?"

El teu cor s’enfonsa. Vau pensar que havíeu acabat amb la complicada part de disseny d'algorisme! Intenteu pensar en més maneres de resoldre el problema, però l’únic que podeu pensar és l’aproximació que ja heu aconseguit.

Això passa a gairebé tothom. I no és perquè siguin ximples. És perquè la majoria de la gent no té un mètode per millorar l'eficàcia dels seus algorismes.

Però la veritat és que n'hi ha moltes. La propera vegada que vagi ensopegat, prova d'aplicar aquests tres enfocaments habituals.

1. Utilitzeu un mapa Hash

És correcte. Els mapes Hash / matrius i diccionaris associats (varien nombrosos, segons el llenguatge de programació que utilitzeu) que tenen una capacitat màgica de disminuir el temps d'execució d'algorismes.

Per exemple, suposem que la pregunta era trobar el número més repetit en una matriu de números.

El vostre primer pensament pot ser saltar a alguns bucles. Per a cadascun dels nostres números, calculeu el seu recompte i vegeu si és el més gran. Com aconseguim el recompte de cada número? Enllaça a través de la matriu, comptant quantes vegades es produeix. Així doncs, estem parlant de dos bucles anidats. En pseudocodi:

def get_mode (nums): max_count = 0 mode = null per a potencial_mode en nums: count = 0 per al nombre de la nostra_array: count + = 1 si count> = max_count: mode = potent_mode max_count = mode return return

En aquest moment, fem un recorregut a través de tota la matriu una vegada per cada element de la matriu, però podem fer-ho millor. En gran notació, és el període O (n 2 ) en total.

Si emmagatzemem els nostres comptes en un mapa de hash (assignació de números als seus recomptes), podem resoldre el problema en una sola passejada per la matriu (O (n) temps!):

def get_mode (nums): max_count = 0 mode = null count = nou HashMap, començant cada valor a 0 per a potencial_mode en nums: comptes + = 1 si comptes> max_count: mode = potencial_mode max_count = recompte mode de retorn

Molt més ràpid!

2. Utilitzeu la manipulació de bits

Això realment us distingirà del pack. No s’aplica a tots els problemes, però si ho guardeu a la butxaca de la part posterior i la reboteu en el moment adequat, us semblarà una estrella de rock.

Aquí teniu un exemple: Suposem que teníem una sèrie de números, on cada número apareix dues vegades, excepte un nombre que només es produeix una vegada. Escrivim una funció per trobar el número solitari i que no es repeteix.

El vostre primer instint pot ser utilitzar un mapa de hash, ja que acabem de parlar-ne. Aquest és un bon instint per tenir-ho! I funcionarà per aquest. Podem fer un mapa de "recomptes" molt similar i utilitzar aquest per veure quin número acaba amb un recompte d'1.

Però hi ha una manera encara millor. Si coneixeu la manipulació de bits, potser coneixeu XOR. Una cosa que és especial en XOR és que si XOR un número amb ell mateix, els bits "cancel·len" a 0. Per aquest problema, si XOR tots els números de la matriu junts, ens queda el número que no. no cancel·la:

def find_unrepeated (nums): no es repeteix = 0 per a nums en nums: no es repeteix = no es repeteix XOR num return no es repeteix

3. Vés a la part inferior

Escriviu una funció que emeti el número "enèsim" Fibonacci, donat el número n. Aquest és un clàssic i es presta molt bé a la recursió:

def fib (n): si n és 0 o 1: retornar 1 retorn fib (n-1) + fib (n-2)

Però la simple resposta recursiva no és l’única! Penseu detingudament sobre què fa aquesta funció. Suposem que n és 5. Per obtenir la resposta, truca recursivament fib (4) i fib (3). Ara, què fa això que crida a fib (4)? Anomena fib (3) i fib (2). Però només vam dir que ja teníem una trucada a la fibra (3)! Aquesta bonica funció recursiva fa molts treballs de repetició. El cost total del temps resulta ser O (2 n ). És dolent: molt pitjor que O (n 2 ).

En lloc d’anar de n recursivament a 1, anem de “de baix a dalt”, d’1 a n. Això ens permet ometre la recursió:

def fib (n): anterior = 0 anterior_previous = 1 per a i en el rang 1 a n: actual = anterior + anterior_previous anterior_previous = anterior anterior = corrent de retorn actual

El codi és més llarg, però és molt més eficient. Temps de baixada a O (n). Com a bonus addicional amb el desplegament d'algorismes recursius, estalviem espai. Totes aquelles trucades recurrents es creen a la pila de trucades, que és a la memòria i compta amb el nostre cost espacial. La nostra funció recursiva tenia un cost espacial O (n), però aquest iteratiu ocupa O (1) espai.

La propera vegada que l’entrevistador us demani que milloreu l’eficiència de la vostra solució, proveu de caminar per aquestes estratègies i vegeu si us ajuden. Amb prou pràctica, probablement trobareu un salt directe cap a la solució optimitzada, saltant-vos la solució més ingènua. I això és una gran cosa. No vol dir només que siguis millor entrevistador, sinó que et converteixes en un millor enginyer.