Cómo abordar y resolver problemas complejos de codificación o algoritmos

Desafortunadamente no hay una fórmula mágica involucrada. He practicado la resolución de problemas algorítmicos aún más complejos durante muchos años, y generalmente puedo asociar de inmediato cualquier pregunta con problemas resueltos previamente. Con suficiente experiencia, las preguntas de la entrevista en realidad parecerán bastante fáciles. Mi consejo para cualquiera sería primero obtener una base teórica sólida en algoritmos y luego practicar regularmente en algunos sitios web de programación competitivos. Créeme, valdrá la pena.

MIT tiene una muy buena clase introductoria de algoritmos disponible en línea de forma gratuita Introducción a los algoritmos. En cuanto a los sitios web de programación competitivos, hay muchos de ellos. Mi favorito es Codeforces. Sin embargo, no se concentre en los problemas más difíciles, intente resolver los más fáciles y optimice el tiempo dedicado. Comenzarás a ver patrones después de un tiempo.

Divide y vencerás es la forma general de abordar y resolver un problema complejo. Convierta el problema complejo en un conjunto de problemas más pequeños más integración; repita hasta que los problemas más pequeños sean simples o triviales; resolver e integrar todo; verificar resultados

Sin embargo, aquí hay una duda: en una entrevista, resolver el problema es su objetivo secundario o terciario, no su objetivo principal. En una situación de entrevista, aborda un problema complejo como si realmente resolverlo fuera la tercera cosa más importante que puedes hacer .

¿Qué dos cosas son más importantes?

  1. Demostrando al entrevistador que sería una buena persona para trabajar, demostrando habilidades sociales relevantes para el trabajo
  2. Demostrando al entrevistador que usted es capaz de comunicarse de manera inteligente y competente con sus compañeros de trabajo sobre el problema y sus posibles soluciones, mostrando su trabajo y verbalizando su proceso de pensamiento.

Asegúrese de comprender el problema, incluidas las restricciones en los datos de entrada, salida, arquitectura, etc. ¿Cómo? Pedir.

Proponer una solución. No se preocupe por su complejidad ni nada de eso, solo proponga una solución. Una vez que lo haya descrito, puede discutir la complejidad y la eficiencia.

Tan pronto como una solución que haya propuesto parezca difícil o ineficiente, deje de implementarla y explique por qué al entrevistador. Si tiene una mejor solución en mente, propongala. El entrevistador puede pedirle que termine su primera solución, o puede pedirle que implemente su segunda solución, o puede sugerirle que intente pensar en otra. Pase lo que pase, adelante, deje que el entrevistador conduzca. Esto demuestra el enfoque de “falla rápida” que le servirá bien en el trabajo.

Si no puede resolver el problema durante la entrevista, resuélvalo en su propio tiempo después y escriba al reclutador o al entrevistador con su solución. Esto demuestra algo que todo programador profesional entenderá: que la solución a veces se te ocurre cuando te olvidas del problema y dejas que se agite en tu mente. Nunca es negativo (en mi opinión) resolver el problema más tarde; Lo negativo es darse por vencido.

Buena suerte.

Tl; dr: Divide y vencerás.

Específicamente, confío en la estructura. La metodología básica está encapsulada en Diseño Estructurado , basada en 2 principios generales.

  1. La mejor solución es aquella cuya estructura se asemeja más al problema .
  2. Cualquier problema es una combinación de 3 construcciones básicas:
  1. secuencia,
  2. selección / elección, y
  3. iteración / repetición.

Las estructuras específicas como cola, montón, matriz, etc. son solo formas especializadas, generalmente de iteración. Entonces, paso a paso:

  • Analice el problema en una combinación de las 3 construcciones.
  • Cree su solución coincidente , un objeto / módulo / función a la vez.
  • Pruebe temprano y con frecuencia , comenzando con casos simples.
  • En sus pruebas, incluya todo tipo de posibilidades y cubra cada caso de borde.

Con un plan como ese, seguramente

Nada podría salir mal.

O podría?

Principalmente en entrevistas en vivo, el entrevistador se enfoca más en el enfoque de resolución que en la solución. Si no es el mejor, no hay problema si su enfoque está bien organizado.
La primera y única regla para resolver problemas complejos en un límite de tiempo muy limitado es dividirlo en partes pequeñas y luego tratar de resolver esas partes pequeñas. Eventualmente uno resolverá todo el problema.

En una entrevista en vivo, debe estar 100% seguro de las restricciones, la entrada de datos y la complejidad de tiempo esperada antes de comenzar a codificar ese problema. No dude en verificar las restricciones si no está completamente seguro. Intente nombrar variables por nombre significativo y mantenga las convenciones de codificación.

Después de su solución, es bueno probar su enfoque con su conjunto de datos personalizado y siempre tratar de resaltar alguna parte donde pueda mejorar su solución.

Hay un sitio llamado Pramp donde uno puede tener una entrevista simulada gratuita. Es bueno tomar un poco antes de la entrevista real.

Solo mira el papel y comienza a escribir. No importa si lo que escribe es basura, porque si tiene habilidades de desarrollo, lo resolverá rápidamente y descubrirá lo que debe hacer para mejorarlo. Por lo tanto, llegará rápidamente a una solución iterativa razonable para su problema.

Después de un poco de práctica, puede hacer la mayor parte de esto en su cabeza: no necesita todas las notas de garabato y ejercicio.

More Interesting

¿Cómo manejan los sistemas de reputación los sesgos (sistémicos) que pueden distorsionar significativamente las clasificaciones basadas en tales sistemas?

¿Soy solo yo o el algoritmo recursivo de Fibonacci es brillantemente complejo?

Dado que solo quedan 2 meses para las regiones regionales de ACM ICPC, ¿cuántos problemas podría resolver allí si comenzara a practicar ahora, teniendo solo la idea más básica sobre algoritmos?

¿Cuál es la forma más compleja de reducir 1 + 1?

¿Qué puedes hacer con los algoritmos?

Cómo encontrar el promedio de todos los múltiplos de un número de un rango de números

Cómo determinar si un conjunto dado se puede dividir en dos subconjuntos o más de modo que la suma de los elementos en esos subconjuntos sea la misma

¿Por qué las listas enlazadas son más convenientes que las matrices en el dominio de la computación simbólica?

Digamos que encontramos un algoritmo que resuelve problemas de NP-Complete en tiempo polinómico pero no podemos probarlo. ¿Cuáles serían las consecuencias?

¿Cuál es el entero más pequeño que tiene 30 factores?

¿Puedes ser bueno en la programación pero malo en los algoritmos?

¿En qué paso de la prueba del algoritmo de Dijkstra utilizamos el hecho crucial de que los bordes no son negativos?

¿Las personas en la industria realmente usan el algoritmo K-Nearest Neighbour en la práctica?

¿Cuáles son los principios para crear algoritmos utilizando tipos de datos abstractos?

¿Cuál es el algoritmo más corto para probar si dos cadenas son anagramas?