curso
As 24 principais perguntas da entrevista sobre programação para 2025
Se você está procurando uma nova oportunidade em desenvolvimento de software ou análise de dados ou um gerente de contratação que interrogará um candidato a uma vaga de emprego em sua empresa, é essencial conhecer as perguntas e respostas comuns de entrevistas sobre programação.
A preparação para essas perguntas costuma ser um processo difícil e demorado do ponto de vista do empregador e do candidato.
Neste artigo, examinaremos 24 perguntas e respostas essenciais sobre programação para profissionais iniciantes, intermediários e avançados. Essas perguntas e respostas ajudarão você a se preparar melhor para a entrevista e a saber o que esperar do entrevistador/entrevistado.
Perguntas da entrevista sobre programação básica
Vamos começar com algumas das perguntas mais fáceis e mais comuns em entrevistas sobre programação.
1. O que é uma variável em programação?
As variáveis são elementos fundamentais na programação. Uma variável é essencialmente um contêiner que armazena dados, e seu valor pode ser alterado durante a execução de um programa. As linguagens de programação modernas oferecem suporte a vários tipos de variáveis, cada uma projetada para tipos de dados e casos de uso específicos.
Se você quiser saber tudo sobre variáveis, nosso curso Introdução ao Python é um ótimo lugar para começar.
2. Explicar os tipos de dados com exemplos
Na programação, os tipos de dados são os tipos de valores que as variáveis podem armazenar. Cada tipo de dados vem com propriedades associadas, que são essenciais para que você saiba quais operações matemáticas, relacionais ou lógicas podem ser realizadas.
Por exemplo, no Python, há vários tipos de dados numéricos, incluindo inteiros, que armazenam números inteiros, e flutuantes, que armazenam valores com pontos decimais. Há também strings, que armazenam sequências ordenadas de caracteres entre aspas simples ou duplas.
integer_var = 25
float_var = 10.2
String_var = "Welcome to DataCamp"
Leia nosso artigo separado para descobrir os tipos de dados Python mais comuns.
3. Explicar a diferença entre linguagens compiladas e interpretadas
A principal diferença entre as linguagens compiladas e interpretadas é como as instruções, também conhecidas como algoritmos, são traduzidas em código de máquina (ou seja, código binário). As linguagens compiladas são traduzidas antes da execução, enquanto as linguagens interpretadas são traduzidas no tempo de execução.
Isso torna as linguagens compiladas mais adequadas para tarefas complexas que exigem velocidade, como o rastreamento de tráfego em tempo real em carros autônomos. Entretanto, as linguagens compiladas, como C e C++, tendem a ser mais difíceis de entender e trabalhar do que as linguagens interpretadas, como Python.
4. O que são condicionais e loops?
As instruções condicionais, comumente conhecidas como instruções if-else, são usadas para executar determinados blocos de código com base em condições específicas. Essas instruções ajudam a controlar o fluxo de um algoritmo, fazendo com que ele se comporte de forma diferente em situações diferentes.
Por outro lado, um loop na programação é uma sequência de código que é repetida continuamente até que uma determinada condição seja atingida, ajudando a reduzir horas de trabalho para segundos. Os loops mais comuns são os loops for e os loops while. Você pode saber mais sobre eles em nosso tutorial de loops separado.
5. Qual é a diferença entre uma matriz e uma lista vinculada?
As matrizes e as listas vinculadas estão entre as estruturas de dados mais importantes. São estruturas que armazenam informações usando estratégias diferentes.
Uma matriz armazena elementos em locais de memória contíguos, ou seja, cada elemento é armazenado em um local de memória adjacente ao outro. Além disso, o tamanho de uma matriz é imutável e é declarado previamente.
Matriz. Fonte
Por outro lado, as listas vinculadas usam ponteiros para armazenar o endereço de memória do próximo elemento, conforme mostrado abaixo.
Lista vinculada. Fonte
Em geral, as matrizes são preferíveis quando é necessário um acesso rápido aos elementos e a memória é uma preocupação, enquanto as listas vinculadas são melhores em casos de inserções e exclusões frequentes.
6. Explique a recursão com um exemplo
Na programação, a recursão ocorre quando uma função chama a si mesma. Um ótimo exemplo de recursão é uma função criada para calcular o fatorial de um número. Lembre-se de que o fatorial de um número inteiro não negativo n é o produto de todos os números inteiros positivos menores ou iguais a n.
def factorial(n):
if n < 2:
return 1
else:
return n * factorial(n-1)
factorial(5)
>>> 120
Você tem interesse em funções recursivas? Para começar, leia nosso Guia de compreensão de funções recursivas em Python.
7. O que são ponteiros e como eles funcionam?
Um ponteiro é uma variável que armazena o endereço de memória de outra variável como seu valor. Comumente usados em estruturas de dados como listas vinculadas, os ponteiros permitem acesso à memória de baixo nível, alocação dinâmica de memória e muitas outras funcionalidades.
8. O que é a notação Big-O e por que ela é importante?
A notação Big-O é uma notação matemática usada para descrever a complexidade dos algoritmos. A notação Big O mede a complexidade do pior caso de um algoritmo. Ele considera a complexidade de tempo, ou seja, o tempo que um algoritmo leva para ser totalmente executado, e a complexidade de espaço, o espaço de memória extra exigido por um algoritmo. Neste tutorial, explicamos a você os fundamentos da notação Big O.
Perguntas da entrevista sobre programação intermediária
Nesta seção, concentramo-nos em perguntas comuns para candidatos que se preparam para cargos de nível médio com alguma experiência.
Perguntas da entrevista sobre programação orientada a objetos
9. Quais são os quatro pilares da OOP?
A programação orientada a objetos é um paradigma que se concentra em objetos. A OOP baseia-se nos quatro pilares a seguir:
- Abstração. A abstração na OOP nos permite lidar com a complexidade ocultando detalhes desnecessários do usuário. Isso permite que o usuário implemente uma lógica mais complexa sobre a abstração fornecida sem entender ou mesmo pensar em toda a complexidade oculta.
- Encapsulamento. Esse processo de agrupar seus dados e comportamento em um objeto definido por uma classe é chamado de encapsulamento.
- Herança. Essa propriedade permite a criação de novas classes que mantêm a funcionalidade das classes principais.
- Polimorfismo. O polimorfismo é um conceito que permite que você use o mesmo nome para diferentes métodos que têm comportamentos diferentes, dependendo da entrada.
Há vários recursos para você aprender a usar a programação orientada a objetos, incluindo o curso OOP in Python do DataCamp, o curso OOP in R e o tutorial OOP in Java.
10. Explique a diferença entre classe e objeto
Na programação orientada a objetos, os dados e os métodos são organizados em objetos que são definidos por sua classe. As classes são projetadas para determinar como cada objeto deve se comportar e, em seguida, os objetos são projetados dentro dessa classe.
11. O que é polimorfismo e como ele é implementado em Java/Python?
Na OOP, o polimorfismo permite que você use o mesmo nome para diferentes métodos que têm comportamentos diferentes, dependendo da entrada. Isso é comumente usado em combinação com herança.
Por exemplo, digamos que você tenha uma classe principal chamada Shape que tenha um método para calcular a área da forma. Você pode ter duas classes de crianças, Circle e Square. Embora cada um tenha o método chamado Area, a definição desse método será diferente para cada forma. Compare os métodos de área para as diferentes formas no bloco de código abaixo.
# 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. Explique a diferença entre herança e composição
Tanto a herança quanto a composição são técnicas usadas na OOP para aprimorar a reutilização do código. O primeiro é o mecanismo pelo qual uma nova classe é derivada de uma classe existente, herdando todas as suas propriedades e métodos. O último envolve a criação de objetos complexos combinando partes simples em vez de herdar de uma classe base.
De modo geral, a composição oferece várias vantagens em relação à herança, incluindo maior flexibilidade, menor complexidade e melhor capacidade de manutenção.
Perguntas da entrevista sobre programação funcional
13. O que é programação funcional?
Na ciência da computação, a programação funcional é um paradigma de programação em que os programas são construídos por meio da aplicação e da composição de funções. É um subtipo do paradigma de programação declarativa.
A programação funcional se destaca por sua rastreabilidade e previsibilidade. Isso ocorre porque as funções usadas são imutáveis, ou seja, não podem ser alteradas. As funções são definidas, geralmente em uma seção separada do código (ou, às vezes, em um arquivo diferente), e depois usadas em todo o código, conforme necessário. Esse atributo facilita a determinação do que está acontecendo em uma seção de código, pois a função tem o mesmo desempenho e é chamada da mesma forma em todos os lugares.
Você ainda está confuso sobre as diferenças entre a programação funcional e a OOP? Consulte nosso guia separado para esclarecer as coisas.
14. Qual é a diferença entre programação imperativa e declarativa?
Em termos de paradigmas de programação, há duas categorias amplas nas quais muitos dos paradigmas comumente usados se enquadram: programação imperativa e declarativa.
Em um nível mais alto, a programação imperativa é uma categoria de paradigmas em que o programador define as instruções exatas para o programa seguir passo a passo. O foco está em como executar o programa. Esse estilo de paradigma de programação pode ser pensado em termos de um fluxograma, em que o programa segue um determinado caminho com base em entradas especificadas. A maioria das linguagens de programação convencionais usa a programação imperativa.
A programação declarativa, por outro lado, é uma categoria de paradigmas em que o programador define a lógica do programa, mas não fornece detalhes sobre as etapas exatas que o programa deve seguir. O foco está no que o programa deve executar, e não exatamente como. Esse tipo de programação é menos comum, mas pode ser usado em situações em que as regras são especificadas e o caminho exato para a solução não é conhecido. Um exemplo pode ser a solução de um quebra-cabeça de números como o Sudoku.
Há muito mais para falar sobre paradigmas de programação. Por isso, não podemos perder a oportunidade de recomendar a você nosso curso de Introdução aos Paradigmas de Programação.
15. O que são funções puras e por que elas são importantes?
As funções puras são um componente essencial da programação funcional. De forma simples, uma função pura é um processo que recebe valores de entrada e retorna valores de saída com base apenas nos valores de entrada. As funções puras não têm "efeitos colaterais", o que significa que elas não influenciam outras variáveis do programa, não gravam em arquivos e não alteram as informações armazenadas em um banco de dados.
A natureza das funções puras faz delas a companhia perfeita para os programadores. Primeiro, elas são muito fáceis de depurar, pois qualquer função pura com o mesmo conjunto de parâmetros sempre retornará o mesmo valor.
Pelo mesmo motivo, as funções puras são mais fáceis de paralelizar, ao contrário das funções impuras, que podem interferir de tal forma que você obtém resultados diferentes em execuções diferentes porque elas atualizam ou leem variáveis mutáveis em uma ordem diferente.
16. Explique as funções de ordem superior com um exemplo
Na programação funcional, em contraste com as funções puras, uma função de ordem superior é uma função que recebe uma ou mais funções como argumentos (ou seja, um parâmetro processual, que é um parâmetro de um procedimento que é um procedimento em si), retorna uma função ou ambos.
Um exemplo comum de uma função de alta ordem é a map()
do Python. Comum em muitas linguagens de programação funcional, o map()
recebe como argumentos uma função f e uma coleção de elementos e retorna uma nova coleção com a função aplicada a cada elemento da coleção. Por exemplo, digamos que você tenha uma lista de números e queira uma nova coleção com os números convertidos em floats.
numbers = [1,2,3,4]
res = map(float, numbers)
print(list(numbers))
>>> [1.0, 2.0, 3.0, 4.0]
Perguntas da entrevista sobre programação avançada
Por fim, vamos ver algumas das perguntas mais comuns feitas por candidatos experientes que buscam as principais empresas de tecnologia.
Perguntas da entrevista sobre programação dinâmica
17. O que é programação dinâmica e quando ela é usada?
A programação dinâmica é um método usado para resolver problemas complexos, dividindo-os em subproblemas menores e sobrepostos.
Em vez de começar do zero todas as vezes, você mantém o controle das soluções para essas partes menores, o que significa que não precisa fazer os mesmos cálculos repetidamente. Esse método é muito útil para encontrar a maior subsequência comum entre duas cadeias de caracteres ou para encontrar o custo mínimo para chegar a um ponto específico em uma grade.
18. Explique a diferença entre memoização e tabulação
A memorização e a tabulação são duas técnicas poderosas da programação dinâmica para otimizar o desempenho de algoritmos, geralmente algoritmos recursivos.
A memoização, também conhecida como catching, envolve o armazenamento do resultado de chamadas de funções caras e o retorno dos resultados armazenados sempre que as mesmas entradas ocorrerem novamente. Dessa forma, os subproblemas são computados apenas uma vez. A memoização segue uma abordagem de cima para baixo, o que significa que começamos a partir do "problema principal" e recorremos para baixo para resolver e armazenar em cache vários subproblemas.
Por outro lado, a tabulação envolve o cálculo de todos os menores subproblemas e o armazenamento dos resultados em uma tabela. É considerada uma abordagem de baixo para cima porque começa resolvendo os menores subproblemas e, quando temos todas as soluções para esses subproblemas, calculamos a solução para o problema principal.
19. Resolver a sequência de Fibonacci usando programação dinâmica
A sequência de Fibonacci é a seguinte: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34... onde cada número na sequência é encontrado somando-se os dois números anteriores a ele.
A maneira mais intuitiva de resolver o problema é por meio de recursão, como mostrado abaixo.
# a simple recursive program for Fibonacci numbers
def fib(n):
if n <= 1:
return n
return fib(n - 1) + fib(n - 2)
No entanto, essa não é a maneira mais eficiente de encontrar a sequência. O algoritmo anterior tem uma complexidade de tempo exponencial, conhecida como O(2^N), o que significa que o número de cálculos aumenta exponencialmente à medida que N aumenta.
Outra maneira de analisar o problema da sequência de Fibonacci é dividi-lo em pequenos subproblemas, como segue:
Sequência de Fibonacci para fib(5). Fonte
Como você pode ver, se executássemos nosso código para n=5, a função fib()
calcularia a mesma operação várias vezes, resultando em um desperdício de recursos de computação.
A programação dinâmica oferece várias técnicas para otimizar o cálculo da sequência de Fibonacci.
Vamos analisar o problema com a memoização. Como já foi mencionado, ele envolve o armazenamento do resultado de chamadas de funções caras e o retorno dos resultados armazenados sempre que as mesmas entradas ocorrerem novamente. Isso é feito com o código a seguir, que armazena os resultados da função fibonacci_memo()
em um dicionário. Com essa otimização, o cálculo de todas as entradas é computado apenas uma vez, reduzindo a complexidade de tempo para linear, conhecida 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. Explicar o conceito de subestrutura ideal e subproblemas sobrepostos
Na programação dinâmica, os subproblemas são versões menores do problema original. Qualquer problema tem subproblemas sobrepostos se encontrar sua solução envolver a resolução do mesmo subproblema várias vezes, como o cálculo da sequência de Fibonacci acima.
Por outro lado, considera-se que um problema tem uma subestrutura ideal se a solução ideal para o problema em questão puder ser construída a partir de soluções ideais de seus subproblemas.
Perguntas da entrevista técnica sobre programação
21. Explicar como funcionam as tabelas hash
Hashmaps, também conhecidos como hashtables, representam uma das implementações mais comuns de hashing. O Hashmaps armazena pares de valores-chave (por exemplo, ID e nome do funcionário) em uma lista que pode ser acessada por meio de seu índice. Podemos dizer que um hashmap é uma estrutura de dados que utiliza técnicas de hashing para armazenar dados de forma associativa.
A ideia por trás dos hashmaps é distribuir as entradas (pares de chave/valor) em uma matriz de buckets. Dada uma chave, uma função de hashing calculará um índice distinto que sugere onde a entrada pode ser encontrada. O uso de um índice em vez da chave original torna os hashmaps particularmente adequados para várias operações de dados, incluindo inserção, remoção e pesquisa de dados.
Um exemplo ilustrativo de hashtables são os dicionários Python. Confira nosso Guia de Hashmaps do Python para saber mais sobre essas estruturas de dados poderosas.
22. O que é um deadlock em multithreading?
O threading permite que você tenha diferentes partes do seu processo executadas simultaneamente. Essas diferentes partes geralmente são individuais e têm uma unidade de execução separada pertencente ao mesmo processo. O processo nada mais é do que um programa em execução que tem unidades individuais que podem ser executadas simultaneamente.
O deadlock ocorre quando vários threads ficam indefinidamente bloqueados, aguardando recursos que outros threads possuem. Esse cenário leva a um ciclo inquebrável de dependências em que nenhum thread envolvido pode progredir.
Leia o tutorial sobre threading em Python da DataCamp para saber mais sobre threads e por que elas são importantes para a análise de dados,
23. Qual é a diferença entre a busca em largura (BFS) e a busca em profundidade (DFS)?
Breadth-first search (BFS) e depth-first search (DFS) são algoritmos de passagem de gráficos projetados para explorar um gráfico ou uma árvore.
O BFS explora um gráfico nível por nível, visitando todos os nós na profundidade atual antes de passar para a próxima. Por outro lado, o DFS prioriza a exploração de um ramo o mais profundamente possível antes de voltar atrás para investigar ramos alternativos.
O BFS é particularmente útil quando o objetivo é encontrar o caminho mais curto em um gráfico não ponderado. No entanto, o BFS pode usar muita memória, especialmente em gráficos amplos, porque precisa manter o controle de todos os nós em cada nível. O BFS é uma excelente opção para análise de redes sociais ou problemas simples de roteamento.
O DFS, por outro lado, é útil quando o objetivo é explorar todos os caminhos ou soluções possíveis, como resolver quebra-cabeças ou encontrar ciclos em um gráfico. Ao contrário do BFS, o DFS não garante o caminho mais curto. No entanto, ele é mais eficiente em termos de memória, pois só mantém o controle do caminho atual.
Você pode saber mais sobre esses algoritmos em nosso Guia de pesquisa Breadth-First e Guia de pesquisa Depth-First.
24. Qual é a complexidade de tempo do quicksort e do mergesort?
A classificação por mesclagem funciona dividindo recursivamente a matriz de entrada em subvariedades menores e classificando essas subvariedades e, em seguida, mesclando-as novamente para obter a saída classificada. Ele tem uma complexidade de tempo linearítmica, conhecida como O(N log(N)).
Na notação Big O, o tempo linearítmico se comporta de forma semelhante ao tempo linear, o que significa que, se a quantidade de dados de entrada for dobrada, o tempo que a classificação de mesclagem leva para processar os dados também dobrará.
O algoritmo de classificação rápida usa uma técnica de partição, escolhendo um valor da lista chamado de pivô. Todos os itens menores que o pivô terminarão à esquerda do pivô, e os elementos maiores à direita. O Quick sort será chamado recursivamente nos elementos à esquerda e à direita do pivô.
A classificação rápida tem uma complexidade de tempo exponencial, conhecida como O(N^2), para o pior cenário, que ocorre quando a escolha do pivô resulta consistentemente em partições desequilibradas.
Conclusão
Neste artigo, abordamos várias perguntas de entrevistas de programação que abrangem tópicos básicos, intermediários e avançados. Desde a compreensão dos conceitos básicos de estruturas de dados, como matrizes e listas vinculadas, até o aprofundamento em técnicas mais complexas das disciplinas de OOP, programação funcional e programação dinâmica, exploramos as principais áreas sobre as quais os possíveis empregadores podem fazer perguntas.
Se você precisar de mais treinamento em programação para sua entrevista ou estiver interessado em perguntas de entrevistas para outras funções no campo de dados e IA, confira os recursos a seguir:
- 28 principais perguntas para entrevistas com cientistas de dados para todos os níveis
- As 36 principais perguntas e respostas da entrevista sobre Python para 2025
- As 51 principais perguntas e respostas da entrevista sobre data warehouse para 2025
- As 30 principais perguntas da entrevista sobre aprendizado de máquina para 2025
- 80 principais perguntas e respostas para entrevistas sobre SQL [2025]
- Praticando perguntas de codificação para entrevistas no curso de Python
- As 30 principais perguntas da entrevista sobre Big Data: Um guia de prática completo
- As 39 principais perguntas e respostas da entrevista sobre engenharia de dados em 2025
- As 34 principais perguntas e respostas da entrevista sobre o MySQL para 2025
Perguntas frequentes sobre a entrevista de programação
Por que é importante treinar para entrevistas de programação?
Se você está procurando uma nova oportunidade em desenvolvimento de software ou análise de dados ou um gerente de contratação que interrogará um candidato a uma vaga de emprego em sua empresa, é essencial conhecer as perguntas e respostas comuns de entrevistas sobre programação. Você deve ser capaz de demonstrar sua amplitude de conhecimento aplicável à função para a qual está sendo entrevistado.
As perguntas da entrevista sobre programação são difíceis?
É difícil estimar a dificuldade de programar entrevistas. Muitas variáveis podem afetar sua complexidade, inclusive o conhecimento técnico do entrevistador, a natureza da função e o nível de senioridade. No entanto, estar preparado é a melhor ideia.
Qual é a melhor maneira de você se preparar para as perguntas da entrevista sobre programação?
Aqui estão algumas dicas para você se preparar para entrevistas de programação:
- Atualize seus conceitos básicos
- Colete experiências anteriores e crie histórias interessantes
- Pratique a codificação e a solução de problemas
- Pratique com projetos reais
- Estudar minuciosamente as perguntas da entrevista
Por que é importante aprender as perguntas da entrevista de programação para a contratação de especialistas?
O objetivo de uma entrevista de programação é avaliar as habilidades técnicas, as habilidades de resolução de problemas e a criatividade do candidato. Para avaliar essas habilidades e obter o máximo do candidato, os entrevistadores também devem estar familiarizados com os conceitos de programação.

Sou analista de dados freelancer, colaborando com empresas e organizações em todo o mundo em projetos de ciência de dados. Também sou instrutor de ciência de dados com mais de 2 anos de experiência. Escrevo regularmente artigos relacionados à ciência de dados em inglês e espanhol, alguns dos quais foram publicados em sites consagrados, como DataCamp, Towards Data Science e Analytics Vidhya Como cientista de dados com formação em ciência política e direito, meu objetivo é trabalhar na interação de políticas públicas, direito e tecnologia, aproveitando o poder das ideias para promover soluções e narrativas inovadoras que possam nos ajudar a enfrentar desafios urgentes, como a crise climática. Eu me considero uma pessoa autodidata, um aprendiz constante e um firme defensor da multidisciplinaridade. Nunca é tarde demais para aprender coisas novas.
Principais cursos da DataCamp
curso
Introdução à programação orientada a objetos em Java
curso
Programação paralela em R

blog
As 26 principais perguntas e respostas da entrevista sobre pandas em Python

Srujana Maddula
15 min
blog
As 20 principais perguntas da entrevista sobre o NumPy: Do básico ao avançado

Tim Lu
20 min

blog
As 25 principais perguntas da entrevista sobre aprendizado de máquina para 2024

blog
As 45 principais perguntas da entrevista sobre PostgreSQL para todos os níveis

blog
As 30 principais perguntas da entrevista sobre o Excel para todos os níveis
tutorial