Skip to main content

3 formas de mejorar su solución de entrevista de codificación - the muse

Cómo Ser Más Productivo y Mejorar Tu Capacidad Para Resolver Problemas | Ejercicio Físico y Mental (Julio 2025)

Cómo Ser Más Productivo y Mejorar Tu Capacidad Para Resolver Problemas | Ejercicio Físico y Mental (Julio 2025)
Anonim

Así que ahí estás. Aliviado Agotado. Finalmente ha llegado a un enfoque para resolver la difícil pregunta de codificación que le hace su entrevistador. Tal vez incluso lo escribió en la pizarra, línea por línea. ¡Y lo hiciste bien! Estás a solo 20 minutos de la reunión. Tu entrevistador debe estar impresionado.

¿Correcto?

"Esto funcionará, pero ¿alguna idea de cómo hacerlo de manera más eficiente?"

Tu corazón se hunde. ¡Pensaste que habías terminado con la parte difícil del diseño del algoritmo! Intenta pensar en más formas de resolver el problema, pero todo lo que puede pensar es en el enfoque que ya se le ocurrió.

Esto le sucede a casi todos. Y no es porque sean estúpidos. Es porque la mayoría de las personas no tienen un método para mejorar la eficiencia de sus algoritmos.

Pero la verdad es que hay muchas. La próxima vez que esté perplejo, intente aplicar estos tres enfoques comunes.

1. Use un mapa hash

Está bien. Los mapas de hash / matrices asociativas / diccionarios (tienen muchos nombres, dependiendo del lenguaje de programación que esté usando) tienen una habilidad mágica para reducir el tiempo de ejecución de los algoritmos.

Por ejemplo, supongamos que la pregunta era encontrar el número más repetido en una matriz de números.

Su primer pensamiento podría ser saltar a algunos bucles. Para cada uno de nuestros números, calcule su recuento y vea si es el más grande. ¿Cómo obtenemos el recuento de cada número? Recorre la matriz y cuenta cuántas veces ocurre. Entonces estamos hablando de dos bucles anidados. En pseudocódigo:

def get_mode (nums): max_count = 0 mode = null para potencial_mode en nums: count = 0 para número en our_array: count + = 1 if count> = max_count: mode = potencial_mode max_count = count return mode

En este momento, estamos recorriendo toda nuestra matriz una vez para cada elemento de la matriz, pero podemos hacerlo mejor. En la notación O grande, ese es el tiempo O (n 2 ) en total.

Si almacenamos nuestros recuentos en un mapa hash (asignando números a sus recuentos), podemos resolver el problema en un solo recorrido por la matriz (¡O (n) tiempo!):

def get_mode (nums): max_count = 0 mode = null count = new HashMap, comenzando cada valor en 0 para potencial_mode en nums: contar + = 1 si cuenta> max_count: mode = potencial_mode max_count = cuenta modo de retorno

¡Mucho mas rápido!

2. Utilice la manipulación de bits

Esto realmente te distinguirá del resto. No se aplica a todos los problemas, pero si guarda esto en su bolsillo trasero y lo saca en el momento adecuado, se verá como una estrella de rock.

Aquí hay un ejemplo: supongamos que tenemos una matriz de números, donde cada número aparece dos veces, excepto un número que solo ocurre una vez. Estamos escribiendo una función para encontrar el número solitario y no repetido.

Su primer instinto podría ser utilizar un mapa hash, ya que acabamos de hablar de ello. Ese es un buen instinto para tener! Y funcionará para este. Podemos hacer un mapa de "recuentos" muy similar, y usarlo para ver qué número termina con un recuento de 1.

Pero hay una forma aún mejor. Si está familiarizado con la manipulación de bits, puede estar familiarizado con XOR. Una cosa que es especial acerca de XOR es que si XOR un número consigo mismo, los bits "se cancelan" a 0. Para este problema, si XOR juntamos todos los números de la matriz, nos quedaremos con el número que no no cancelar:

def find_unrepeated (nums): unrepeated = 0 para num en nums: sin repetición = no repetido XOR num return no repetido

3. Ir de abajo hacia arriba

Escriba una función que genere el número "enésimo" de Fibonacci, dado un número n. Este es un clásico, y se presta muy bien a la recursividad:

def fib (n): si n es 0 o 1: return 1 return fib (n-1) + fib (n-2)

¡Pero la respuesta recursiva simple no es la única! Piensa cuidadosamente sobre lo que hace esta función. Supongamos que n es 5. Para obtener la respuesta, llama recursivamente fib (4) y fib (3). Ahora, ¿qué hace esa llamada a fib (4)? Se llama fib (3) y fib (2). ¡Pero acabamos de decir que ya teníamos una llamada a fib (3)! Esta linda función recursiva hace mucho trabajo repetido. El costo total del tiempo resulta ser O (2 n ). Eso es malo, mucho peor que O (n 2 ).

En lugar de pasar de n recursivamente a 1, vayamos de abajo hacia arriba de 1 a n. Esto nos permite omitir la recursividad:

def fib (n): previous = 0 previous_previous = 1 para i en el rango de 1 a n: current = previous + previous_previous previous_previous = previous previous = current return current

¡El código es más largo, pero es mucho más eficiente! Abajo a O (n) tiempo. Como una ventaja adicional con los algoritmos recursivos de desenrollado, ahorramos espacio. Todas esas llamadas recursivas se acumulan en la pila de llamadas, que se encuentra en la memoria y cuenta para nuestro costo de espacio. Nuestra función recursiva tenía un costo de espacio O (n), pero este iterativo toma espacio O (1).

La próxima vez que su entrevistador le pida que mejore la eficiencia de su solución, intente analizar estas estrategias y ver si le ayudan. Con suficiente práctica, probablemente te encuentres saltando directamente a la solución optimizada, omitiendo la solución más ingenua. Y eso es una gran cosa. No solo significa que te estás convirtiendo en un mejor entrevistador, sino que te estás convirtiendo en un mejor ingeniero.