Curso
Tanto si estás buscando una nueva oportunidad en el ámbito del desarrollo de software o el análisis de datos como si eres un responsable de contratación que va a entrevistar a un candidato para un puesto vacante en tu empresa, es imprescindible conocer las preguntas y respuestas más habituales en las entrevistas de programación.
Prepararse para estas preguntas suele ser un proceso difícil y que requiere mucho tiempo, tanto desde la perspectiva del empleador como del candidato.
En este artículo, examinaremos 24 preguntas y respuestas esenciales sobre programación para profesionales principiantes, intermedios y avanzados. Estas preguntas y respuestas te ayudarán a prepararte mejor para la entrevista y a saber qué esperar de tu entrevistador/entrevistado.
Preguntas básicas para entrevistas sobre programación
Comencemos con algunas de las preguntas más fáciles y comunes en las entrevistas de programación.
1. ¿Qué es una variable en programación?
Las variables son elementos fundamentales en la programación. Una variable es esencialmente un contenedor que almacena datos, y su valor puede modificarse durante la ejecución de un programa. Los lenguajes de programación modernos admiten varios tipos de variables, cada una diseñada para tipos de datos y casos de uso específicos.
Si quieres saberlo todo sobre las variables, nuestro curso Introducción a Python es un excelente punto de partida.
2. Explica los tipos de datos con ejemplos.
En programación, los tipos de datos son los tipos de valores que pueden almacenar las variables. Cada tipo de datos tiene propiedades asociadas, que son esenciales para saber qué operaciones matemáticas, relacionales o lógicas se pueden realizar.
Por ejemplo, en Python hay varios tipos de datos numéricos, entre ellos los enteros, que almacenan números enteros, y los flotantes, que almacenan valores con decimales. También hay cadenas, que almacenan secuencias ordenadas de caracteres entre comillas simples o dobles.
integer_var = 25
float_var = 10.2
String_var = "Welcome to DataCamp"
Lee nuestro artículo aparte para descubrir los tipos de datos más comunes de Python.
3. Explica la diferencia entre lenguajes compilados e interpretados.
La principal diferencia entre los lenguajes compilados y los interpretados es la forma en que las instrucciones, también conocidas como algoritmos, se traducen a código máquina (es decir, código binario). Los lenguajes compilados se traducen antes de su ejecución, mientras que los lenguajes interpretados se traducen en tiempo de ejecución.
Esto hace que los lenguajes compilados sean más adecuados para tareas complejas que requieren velocidad, como el seguimiento del tráfico en tiempo real en los coches autónomos. Sin embargo, los lenguajes compilados, como C y C++, suelen ser más difíciles de entender y manejar que los lenguajes interpretados, como Python.
4. ¿Qué son los condicionales y los bucles?
Las sentencias condicionales, comúnmente conocidas como sentencias if-else, se utilizan para ejecutar determinados bloques de código en función de condiciones específicas. Estas instrucciones ayudan a controlar el flujo de un algoritmo, haciendo que se comporte de manera diferente en distintas situaciones.
Por el contrario, un bucle en programación es una secuencia de código que se repite continuamente hasta que se alcanza una determinada condición, lo que ayuda a reducir horas de trabajo a segundos. Los bucles más comunes son los bucles «Bucle for» y «while». Puedes obtener más información sobre ellos en nuestro tutorial sobre bucles.
5. ¿Cuál es la diferencia entre un arreglo y una lista enlazada?
Los arreglos y las listas enlazadas se encuentran entre las estructuras de datos más importantes. Son estructuras que almacenan información utilizando diferentes estrategias.
Un arreglo almacena elementos en ubicaciones contiguas de la memoria, es decir, cada elemento se almacena en una ubicación de memoria adyacente a otra. Además, el tamaño de un arreglo es inmutable y se declara de antemano.

Arreglo. Fuente
Por el contrario, las listas enlazadas utilizan punteros para almacenar la dirección de memoria del siguiente elemento, como se muestra a continuación.

Lista enlazada. Fuente
En general, los arreglos son preferibles cuando se necesita un acceso rápido a los elementos y la memoria es un factor importante, mientras que las listas enlazadas son mejores en casos de inserciones y eliminaciones frecuentes.
6. Explica la recursividad con un ejemplo.
En programación, la recursividad se produce cuando una función se llama a sí misma. Un buen ejemplo de recursividad es una función diseñada para calcular el factorial de un número. Recuerda que el factorial de un número entero no negativo n es el producto de todos los números enteros positivos menores o iguales a n.
def factorial(n):
if n < 2:
return 1
else:
return n * factorial(n-1)
factorial(5)
>>> 120
¿Te interesan las funciones recursivas? Lee nuestra guía Comprender las funciones recursivas en Python para empezar.
7. ¿Qué son los punteros y cómo funcionan?
Un puntero es una variable que almacena la dirección de memoria de otra variable como su valor. Comúnmente utilizados en estructuras de datos como listas enlazadas, los punteros permiten el acceso a la memoria de bajo nivel, la asignación dinámica de memoria y muchas otras funciones.
8. ¿Qué es la notación Big-O y por qué es importante?
La notación Big-O es una notación matemática que se utiliza para describir la complejidad de los algoritmos. La notación Big O mide la complejidad en el peor de los casos de un algoritmo. Tiene en cuenta la complejidad temporal, es decir, el tiempo que tarda un algoritmo en ejecutarse por completo, y la complejidad espacial, el espacio de memoria adicional que requiere un algoritmo. En este tutorial te explicamos los fundamentos de la notación Big O.
Preguntas de entrevista sobre programación intermedia
En esta sección, nos centramos en preguntas frecuentes para candidatos que se preparan para puestos de nivel medio con cierta experiencia.
Preguntas de entrevista sobre programación orientada a objetos
9. ¿Cuáles son los cuatro pilares de la POO?
La programación orientada a objetos es un paradigma que se centra en los objetos. La POO se basa en los siguientes cuatro pilares:
- Abstracción. La abstracción en la POO nos permite manejar la complejidad ocultando detalles innecesarios al usuario. Esto permite al usuario implementar una lógica más compleja sobre la abstracción proporcionada sin tener que comprender ni siquiera pensar en toda la complejidad oculta.
- Encapsulación. Este proceso de agrupar tus datos y tu comportamiento en un objeto definido por una clase se denomina encapsulación.
- Herencia. Esta propiedad permite crear nuevas clases que conservan la funcionalidad de las clases padre.
- Polimorfismo. El polimorfismo es un concepto que permite utilizar el mismo nombre para diferentes métodos que tienen comportamientos distintos en función de la entrada.
Existen varios recursos para aprender a utilizar la programación orientada a objetos, entre ellos el curso OOP en Python de DataCamp, el curso OOP en R y el tutorial OOP en Java.
10. Explica la diferencia entre clase y objeto.
En la programación orientada a objetos, los datos y los métodos se organizan en objetos que se definen por su clase. Las clases están diseñadas para dictar cómo debe comportarse cada objeto, y luego los objetos se diseñan dentro de esa clase.
11. ¿Qué es el polimorfismo y cómo se implementa en Java/Python?
En la programación orientada a objetos (OOP), el polimorfismo permite utilizar el mismo nombre para diferentes métodos que tienen comportamientos distintos en función de la entrada. Esto se utiliza habitualmente en combinación con la herencia.
Por ejemplo, supongamos que tenemos una clase principal llamada Shape que tiene un método para calcular el área de la forma. Puedes tener dos clases secundarias, Círculo y Cuadrado. Aunque cada una tendrá el método llamado Área, la definición de ese método será diferente para cada forma. Compara los métodos para calcular el área de las diferentes formas en el bloque de código siguiente.
# Define the parent class Shape
class Shape:
# Initialize the attributes for the shape
def __init__(self, name):
self.name = name
# Define a generic method for calculating the area
def area(self):
print(f"The area of {self.name} is unknown.")
# Define the child class Circle that inherits from Shape
class Circle(Shape):
# Initialize the attributes for the circle
def __init__(self, name, radius):
# Call the parent class constructor
super().__init__(name)
self.radius = radius
# Override the area method for the circle
def area(self):
# Use the formula pi * r^2
area = 3.14 * self.radius ** 2
print(f"The area of {self.name} is {area}.")
# Define the child class Square that inherits from Shape
class Square(Shape):
# Initialize the attributes for the square
def __init__(self, name, side):
# Call the parent class constructor
super().__init__(name)
self.side = side
# Override the area method for the square
def area(self):
# Use the formula s^2
area = self.side ** 2
print(f"The area of {self.name} is {area}.")
12. Explica la diferencia entre herencia y composición.
Tanto la herencia como la composición son técnicas utilizadas en la programación orientada a objetos (OOP) para mejorar la reutilización del código. El primero es el mecanismo por el cual una nueva clase se deriva de una clase existente, heredando todas sus propiedades y métodos. Esto último implica crear objetos complejos combinando partes simples en lugar de heredar de una clase base.
En general, la composición ofrece varias ventajas con respecto a la herencia, entre ellas una mayor flexibilidad, una menor complejidad y una mejor capacidad de mantenimiento.
Preguntas de entrevista sobre programación funcional
13. ¿Qué es la programación funcional?
En informática, la programación funcional es un paradigma de programación en el que los programas se construyen aplicando y componiendo funciones. Es un subtipo del paradigma de programación declarativa.
La programación funcional destaca por su trazabilidad y previsibilidad. Esto se debe a que las funciones utilizadas son inmutables, lo que significa que no pueden modificarse. Las funciones se definen, a menudo en una sección separada del código (o, en ocasiones, en un archivo diferente), y luego se utilizan en todo el código según sea necesario. Este atributo facilita determinar qué está sucediendo en una sección de código, ya que la función se ejecuta de la misma manera y se invoca de la misma manera en todas partes.
¿Todavía tienes dudas sobre las diferencias entre la programación funcional y la programación orientada a objetos? Consulta nuestra guía separada para aclarar tus dudas.
14. ¿Cuál es la diferencia entre la programación imperativa y la programación declarativa?
En cuanto a los paradigmas de programación, hay dos grandes categorías en las que se engloban muchos de los paradigmas más utilizados: la programación imperativa y la programación declarativa.
A alto nivel, la programación imperativa es una categoría de paradigmas en la que el programador detalla las instrucciones exactas que debe seguir el programa paso a paso. El enfoque está en cómo ejecutar el programa. Este estilo de paradigma de programación podría concebirse en términos de un diagrama de flujo, en el que el programa sigue una ruta determinada basada en entradas específicas. La mayoría de los lenguajes de programación convencionales utilizan la programación imperativa.
La programación declarativa, por el contrario, es una categoría de paradigmas en la que el programador define la lógica del programa, pero no da detalles sobre los pasos exactos que debe seguir el programa. La atención se centra en lo que el programa debe ejecutar, más que en cómo lo hace exactamente. Este tipo de programación es menos habitual, pero puede utilizarse en situaciones en las que las reglas están especificadas y no se conoce el camino exacto hacia la solución. Un ejemplo podría ser resolver un rompecabezas numérico como el Sudoku.
Hay mucho más que decir sobre los paradigmas de programación. Por eso no podemos dejar pasar esta oportunidad de recomendaros nuestro curso Introducción a los paradigmas de programación.
15. ¿Qué son las funciones puras y por qué son importantes?
Las funciones puras son un componente fundamental de la programación funcional. Simplemente, una función pura es un proceso que toma valores de entrada y devuelve valores de salida basándose únicamente en los valores de entrada. Las funciones puras no tienen «efectos secundarios», lo que significa que no influyen en otras variables del programa, no escriben en archivos y no alteran la información almacenada en una base de datos.
La naturaleza de las funciones puras las convierte en la compañera perfecta para los programadores. En primer lugar, son muy fáciles de depurar, ya que cualquier función pura con el mismo conjunto de parámetros siempre devolverá el mismo valor.
Por la misma razón, las funciones puras son más fáciles de paralelizar, en contraste con las funciones impuras, que pueden interferir de tal manera que se obtienen resultados diferentes en diferentes ejecuciones porque actualizan o leen variables mutables en un orden diferente.
16. Explica las funciones de orden superior con un ejemplo.
En la programación funcional, a diferencia de las funciones puras, una función de orden superior es una función que toma una o más funciones como argumentos (es decir, un parámetro procedimental, que es un parámetro de un procedimiento que es en sí mismo un procedimiento), devuelve una función, o ambas cosas.
Un ejemplo común de función de alto orden es la función ` map()` de Python. Común en muchos lenguajes de programación funcional, « map() » (aplicar a cada elemento) toma como argumentos una función f y una colección de elementos, y devuelve una nueva colección con la función aplicada a cada elemento de la colección. Por ejemplo, supongamos que tienes una lista de números y quieres una nueva colección con los números convertidos a flotantes.
numbers = [1,2,3,4]
res = map(float, numbers)
print(list(numbers))
>>> [1.0, 2.0, 3.0, 4.0]
Preguntas de entrevista sobre programación avanzada
Por último, veamos algunas de las preguntas más habituales para candidatos con experiencia que aspiran a trabajar en las principales empresas tecnológicas.
Preguntas de entrevista sobre programación dinámica
17. ¿Qué es la programación dinámica y cuándo se utiliza?
La programación dinámica es un método utilizado para resolver problemas complejos dividiéndolos en subproblemas más pequeños que se superponen entre sí.
En lugar de empezar desde cero cada vez, se lleva un registro de las soluciones de esas partes más pequeñas, lo que significa que no es necesario realizar los mismos cálculos repetidamente. Este método es muy útil para encontrar la subsecuencia común más larga entre dos cadenas o para encontrar el coste mínimo para llegar a un punto específico en una parilla.
18. Explica la diferencia entre memorización y tabulación.
La memorización y la tabulación son dos técnicas muy útiles en la programación dinámica para optimizar el rendimiento de los algoritmos, a menudo algoritmos recursivos.
La memorización, también conocida como captura, consiste en almacenar el resultado de llamadas a funciones costosas y devolver los resultados almacenados cada vez que se producen las mismas entradas. De esta manera, los subproblemas solo se calculan una vez. La memorización sigue un enfoque descendente, lo que significa que partimos del «problema principal» y recurrimos hacia abajo para resolver y almacenar en caché múltiples subproblemas.
Por el contrario, la tabulación implica calcular todos los subproblemas más pequeños y almacenar los resultados en una tabla. Se considera un enfoque ascendente porque comienza resolviendo los subproblemas más pequeños y, una vez que tenemos todas las soluciones a estos subproblemas, calculamos la solución al problema principal.
19. Resuelve la secuencia de Fibonacci utilizando programación dinámica.
La secuencia de Fibonacci es la siguiente: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ... donde cada número de la secuencia se obtiene sumando los dos números anteriores.
La forma más intuitiva de resolver el problema es mediante recursividad, como se muestra a continuación.
# a simple recursive program for Fibonacci numbers
def fib(n):
if n <= 1:
return n
return fib(n - 1) + fib(n - 2)
Sin embargo, esta no es la forma más eficaz de encontrar la secuencia. El algoritmo anterior tiene una complejidad temporal exponencial, indicada como O(2^N), lo que significa que el número de cálculos aumenta exponencialmente a medida que aumenta N.
Otra forma de abordar el problema de la secuencia de Fibonacci es dividirlo en pequeños subproblemas, como se muestra a continuación:

Secuencia de Fibonacci para fib(5). Fuente
Como puedes ver, si ejecutáramos nuestro código para n=5, la función fib() calcularía la misma operación varias veces, lo que supondría un desperdicio de recursos informáticos.
La programación dinámica ofrece varias técnicas para optimizar el cálculo de la secuencia de Fibonacci.
Analicemos el problema con la memoización. Como ya se ha mencionado, consiste en almacenar el resultado de llamadas a funciones costosas y devolver los resultados almacenados cada vez que se repiten las mismas entradas. Esto se logra con el siguiente código, que almacena los resultados de la función fibonacci_memo() en un diccionario. Con esta optimización, el cálculo de todas las entradas solo se realiza una vez, lo que reduce la complejidad temporal a lineal, indicada como O(N).
cache = {0: 0, 1: 1}
def fibonacci_memo(n):
if n in cache: # Base case
return cache[n]
# Compute and cache the Fibonacci number
cache[n] = fibonacci_memo(n - 1) + fibonacci_memo(n - 2) # Recursive case
return cache[n]
[fibonacci_memo(n) for n in range(15)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
20. Explica el concepto de subestructura óptima y subproblemas superpuestos.
En la programación dinámica, los subproblemas son versiones más pequeñas del problema original. Cualquier problema tiene subproblemas superpuestos si encontrar su solución implica resolver el mismo subproblema varias veces, como calcular la secuencia de Fibonacci anterior.
Por otro lado, se considera que un problema tiene una subestructura óptima si la solución óptima al problema dado puede construirse a partir de las soluciones óptimas de sus subproblemas.
Preguntas técnicas para entrevistas de programación
21. Explica cómo funcionan las tablas hash.
Los mapas hash, también conocidos como tablas hash, representan una de las implementaciones más comunes del hash. Los hashmaps almacenan pares clave-valor (por ejemplo, el ID y el nombre de un empleado) en una lista a la que se puede acceder a través de su índice. Podríamos decir que un mapa hash es una estructura de datos que aprovecha las técnicas de hash para almacenar datos de forma asociativa.
La idea detrás de los hashmaps es distribuir las entradas (pares clave/valor) en un arreglo de cubetas. Dada una clave, una función hash calculará un índice distinto que sugiere dónde se puede encontrar la entrada. El uso de un índice en lugar de la clave original hace que los mapas hash sean especialmente adecuados para múltiples operaciones con datos, incluyendo la inserción, eliminación y búsqueda de datos.
Un ejemplo ilustrativo de tablas hash son los diccionarios de Python. Echa un vistazo a nuestra Guía de mapas hash de Python para obtener más información sobre estas potentes estructuras de datos.
22. ¿Qué es un bloqueo en el multithreading?
El subproceso te permite ejecutar diferentes partes de tu proceso simultáneamente. Estas diferentes partes suelen ser individuales y tienen una unidad de ejecución separada que pertenece al mismo proceso. El proceso no es más que un programa en ejecución que tiene unidades individuales que pueden ejecutarse simultáneamente.
El bloqueo se produce cuando varios subprocesos quedan bloqueados indefinidamente, a la espera de recursos que ocupan otros subprocesos. Este escenario conduce a un ciclo irrompible de dependencias en el que ningún hilo involucrado puede avanzar.
Lee el tutorial sobre subprocesos de Python de DataCamp para obtener más información sobre los subprocesos y por qué son importantes para el análisis de datos.
23. ¿Cuál es la diferencia entre la búsqueda en anchura (BFS) y la búsqueda en profundidad (DFS)?
La búsqueda en anchura (BFS) y la búsqueda en profundidad (DFS) son algoritmos de recorrido de grafos diseñados para explorar un grafo o un árbol.
BFS explora un gráfico nivel por nivel, visitando todos los nodos a la profundidad actual antes de pasar al siguiente. Por el contrario, DFS da prioridad a explorar una rama lo más profundamente posible antes de retroceder para investigar ramas alternativas.
El BFS resulta especialmente útil cuando el objetivo es encontrar el camino más corto en un grafo no ponderado. Sin embargo, BFS puede consumir mucha memoria, especialmente en grafos amplios, ya que debe realizar un seguimiento de todos los nodos en cada nivel. BFS es una excelente opción para el análisis de redes sociales o problemas sencillos de enrutamiento.
Por otro lado, el DFS resulta útil cuando el objetivo es explorar todas las rutas o soluciones posibles, como resolver rompecabezas o encontrar ciclos en un gráfico. A diferencia de BFS, DFS no garantiza la ruta más corta. Sin embargo, es más eficiente en cuanto a memoria, ya que solo realiza un seguimiento de la ruta actual.
Puedes obtener más información sobre estos algoritmos en nuestra Guía de búsqueda en anchura y Guía de búsqueda en profundidad.
24. ¿Cuál es la complejidad temporal del ordenamiento rápido y el ordenamiento por fusión?
La clasificación por fusión funciona dividiendo recursivamente el arreglo de entrada en submatrices más pequeñas y clasificando esas submatrices, para luego fusionarlas de nuevo y obtener la salida clasificada. Tiene una complejidad temporal lineal, indicada como O(N log(N)).
En notación Big O, el tiempo linealítico se comporta de manera similar al tiempo lineal, lo que significa que si se duplica la cantidad de datos de entrada, el tiempo que tarda el ordenamiento por fusión en procesar los datos también se duplicará.
El algoritmo de ordenación rápida utiliza una técnica de partición eligiendo un valor de la lista denominado pivote. Todos los elementos más pequeños que el pivote terminarán a la izquierda del pivote, y los elementos más grandes, a la derecha. El ordenamiento rápido se llamará recursivamente sobre los elementos a la izquierda y a la derecha del pivote.
El ordenamiento rápido tiene una complejidad temporal exponencial, indicada como O(N^2), en el peor de los casos, que se produce cuando la elección del pivote da lugar sistemáticamente a particiones desequilibradas.
Conclusión
En este artículo, hemos abordado muchas preguntas de entrevistas de programación que abarcan temas básicos, intermedios y avanzados. Desde comprender los conceptos básicos de las estructuras de datos, como los arreglos y las listas enlazadas, hasta profundizar en técnicas más complejas de las disciplinas de la programación orientada a objetos, la programación funcional y la programación dinámica, hemos explorado las áreas clave sobre las que podrían preguntar los posibles empleadores.
Si necesitas más formación en programación para tu entrevista o te interesan las preguntas de entrevista para otros puestos en el campo de los datos y la IA, consulta los siguientes recursos:
- Las 28 preguntas más importantes en una entrevista para científicos de datos de todos los niveles
- Las 36 preguntas y respuestas más importantes sobre Python para entrevistas de trabajo en 2026
- Las 51 preguntas y respuestas más frecuentes en entrevistas de trabajo sobre almacenes de datos para 2026
- Las 30 preguntas más frecuentes en entrevistas sobre machine learning para 2026
- Las 80 preguntas y respuestas más frecuentes en entrevistas sobre SQL [2026]
- Curso de práctica de preguntas de entrevista sobre programación en Python
- Las 30 preguntas más frecuentes en entrevistas sobre big data: Una guía práctica completa
- Las 39 preguntas y respuestas más importantes para entrevistas de ingeniería de datos en 2026
- Las 34 preguntas y respuestas más frecuentes en entrevistas sobre MySQL para 2026
Preguntas frecuentes sobre entrevistas de programación
¿Por qué es importante practicar para las entrevistas de programación?
Tanto si estás buscando una nueva oportunidad en el ámbito del desarrollo de software o el análisis de datos como si eres un responsable de contratación que va a entrevistar a un candidato para un puesto vacante en tu empresa, es imprescindible conocer las preguntas y respuestas más habituales en las entrevistas de programación. Quieres poder demostrar tu amplio conocimiento aplicable al puesto para el que te estás entrevistando.
¿Son difíciles las preguntas de las entrevistas de programación?
Es difícil estimar la dificultad de las entrevistas de programación. Hay muchas variables que pueden influir en su complejidad, como los conocimientos técnicos del entrevistador, la naturaleza del puesto y el nivel de antigüedad. Sin embargo, lo mejor es estar preparado.
¿Cuál es la mejor manera de prepararse para las preguntas de una entrevista de programación?
A continuación, te ofrecemos algunos consejos para prepararte para las entrevistas de programación:
- Refresca tus conceptos básicos.
- Recopila experiencias previas y crea historias atractivas.
- Practica la programación y la resolución de problemas.
- Practica con proyectos reales
- Estudia detenidamente las preguntas de la entrevista.
¿Por qué es importante aprender preguntas de entrevista sobre programación para contratar especialistas?
El objetivo de una entrevista de programación es evaluar las habilidades técnicas, la capacidad para resolver problemas y la creatividad de los candidatos. Para evaluar estas habilidades y sacar el máximo partido al candidato, los entrevistadores también deben estar familiarizados con los conceptos de programación.

Soy analista de datos autónomo y colaboro con empresas y organizaciones de todo el mundo en proyectos de ciencia de datos. También soy instructor de ciencia de datos con más de 2 años de experiencia. Escribo regularmente artículos relacionados con la ciencia de datos en inglés y español, algunos de los cuales se han publicado en sitios web consolidados como DataCamp, Towards Data Science y Analytics Vidhya Como científico de datos con formación en ciencias políticas y derecho, mi objetivo es trabajar en la interacción de las políticas públicas, el derecho y la tecnología, aprovechando el poder de las ideas para promover soluciones y narrativas innovadoras que puedan ayudarnos a abordar retos urgentes, como la crisis climática. Me considero autodidacta, aprendiz constante y firme partidaria de la multidisciplinariedad. Nunca es demasiado tarde para aprender cosas nuevas.

