El resto de las respuestas proporcionaron una muestra bastante representativa de preguntas de programación dinámica y siempre puede encontrar más en línea (por ejemplo, LeetCode o GeeksForGeeks).
Tenga en cuenta que todos estos son grandes problemas para aprender a programar dinámicamente, pero no tienen nada que ver con los más populares en las entrevistas. De hecho, me sorprendería si alguna vez le hicieran alguna de las preguntas enumeradas en una entrevista a una empresa de alta tecnología . ¿Porqué es eso? Porque los entrevistadores monitorean foros como este para asegurarse de que evitan las preguntas que se han discutido públicamente y que darían una ventaja súper injusta a las personas que se topan con ellos.
Por lo general, cuando las personas preguntan acerca de la popularidad de algo, implican una distribución de energía en la que se usan algunos artículos en cantidad desproporcionada de veces.
- ¿Cuáles son algunas de las mejores canciones electrónicas?
- ¿Quiénes son las mejores raperas negras?
- India: ¿Cuál es el mejor teléfono para comprar entre (Rs, INR) 11-12k?
- ¿Quiénes son los mejores ministros en el Gabinete Modi? ¿Y por qué?
- ¿Dónde están los mejores lugares para vivir en Silicon Valley?
Las preguntas de la entrevista se distribuyen en una distribución mucho más uniforme donde no tiene mucho sentido hablar de popularidad.
Lo que realmente desea preguntar es cuáles son las ideas más populares en las preguntas de programación dinámica y cuáles son los pasos para resolver tales preguntas.
Aquí está una lista de las cosas más importantes para recordar:
- Reconocer un problema de programación dinámica . Este suele ser el paso más difícil y tiene que ver con reconocer que existe una relación recursiva. ¿Se puede expresar el resultado de su problema como una función de los resultados de los problemas más pequeños que parecen iguales?
- Determine el número de parámetros cambiantes . Exprese su problema en términos de los parámetros de la función y vea cuántos de esos parámetros están cambiando. Por lo general, tendrá uno o dos, pero técnicamente este podría ser cualquier número. Los ejemplos típicos para problemas de un parámetro son fibonacci o un problema de cambio de moneda, porque dos parámetros es la distancia de edición.
- Expresar claramente la relación recursiva . Una vez que descubras que la relación recursiva existe y especificas los problemas en términos de parámetros, esto debería ser un paso natural. ¿Cómo se relacionan los problemas entre sí? Es decir, suponiendo que haya calculado los subproblemas, ¿cómo calcularía el problema principal?
- ¿Cuáles son sus casos base? Cuando desglosa los subproblemas en subproblemas más pequeños y los desglosa aún más, ¿cuál es el punto en el que ya no puede romperlo? ¿Todos estos subproblemas terminan dependiendo del mismo subproblema pequeño o varios de ellos?
- Decida si desea implementarlo de forma iterativa o recursiva y siéntase cómodo con ambos . Conozca las compensaciones entre uno u otro, como el desbordamiento de pila recursivo, la escasez de computación, piense si se trata de un trabajo repetido o algo que siempre hace en línea, etc.
- Añadir memoization . Si lo está implementando recursivamente, agregue memoria. Si lo haces de forma iterativa, esto vendrá gratis. Agregar memoización debería ser súper mecánico. Solo vea si ha memorizado el estado al comienzo de su función y agréguelo a la memoria antes de cada declaración de retorno. El valor de la memoria casi siempre debe ser el resultado de su función.
- Complejidad del tiempo = (# de estados posibles * trabajo realizado por cada estado) . Esto también debería ser relativamente mecánico. Cuenta el número de estados que puedes tener. Esto será lineal si tiene un solo parámetro, cuadrático si tiene dos y así sucesivamente. Piense en el trabajo realizado para cada estado; ese es el trabajo que debe hacer asumiendo que ha calculado todos los subproblemas.
Aprende ideas, no aprendas problemas . La cantidad de ideas es significativamente menor y es un espacio más fácil de conquistar que también le servirá mucho mejor.
Cuando sientas que has conquistado estas ideas, echa un vistazo a Refdash donde te entrevista un ingeniero superior y obtén una información detallada sobre tu codificación, algoritmos y diseño del sistema.