Quais São Boas Técnicas de Resolução de Problemas e Formas de Abordar Desafios Algorítmicos?
Durante sua jornada de aprendizado, você deve trabalhar no desenvolvimento de fortes habilidades de resolução de problemas. Essas habilidades essenciais serão fundamentais para enfrentar problemas do mundo real no seu trabalho diário.
Resolver desafios algorítmicos é uma ótima maneira de praticar. Requer uma forma analítica de pensar, sendo capaz de decompor o problema em seus componentes principais e encontrar uma solução que gere a saída correta de forma eficiente.
Mas por onde você começa?
Existem várias técnicas de resolução de problemas que você pode usar para começar a abordar esses desafios.
Como um exemplo, vamos inverter uma
string em JavaScript.
Este é o desafio:
Dada uma string, escreva um algoritmo que retorne uma nova string com os caracteres em ordem inversa.
A primeira coisa que você deve fazer quando encontrar esse tipo de problema é ler a descrição várias vezes para garantir que você entenda o que ela diz. Você pode perder informações críticas se pular esta etapa ou lê-la rápido demais.
Então, uma vez que você esteja familiarizado com o problema, comece a dividi-lo em seus componentes principais.
Pergunte a si mesmo:
* O que é a entrada?
* Qual é a saída esperada?
* Como posso transformar a entrada na saída esperada?
Neste problema, você pode determinar que a entrada é uma string porque o desafio começa com "Given a string…"
A saída é "uma nova string com os caracteres em ordem inversa."
Então você precisa pegar a string original e invertê-la.
Esta análise inicial pode parecer um pouco repetitiva no começo, mas é muito útil para garantir que você compreenda completamente os requisitos.
Então, você deve começar a pensar em como o algoritmo que você irá desenvolver transformará a entrada na saída.
Durante esta fase de planejamento e análise, é comum usar pseudocódigo para mapear os passos necessários.
Pseudocode é uma descrição de alto nível da lógica do algoritmo que é geral por natureza e não é baseada em nenhuma linguagem de programação específica.
Pseudocódigo não é tão formal quanto código real, já que é destinado apenas para humanos lerem. Deve ser fácil de entender à primeira vista. Seu principal objetivo é dar uma ideia clara da sequência de etapas que serão realizadas.
Pseudocódigo é geralmente uma mistura de uma linguagem escrita comum, como o inglês, com construções de programação, como IF, ELSE, FOR e WHILE.
Este é um exemplo de pseudocódigo que você pode escrever para resolver o desafio "Reverse a String".
GET original_string
SET reversed_string = ""
FOR EACH character IN original_string:
ADD character TO THE BEGINNING OF reversed_string
DISPLAY reversed_string
Observe como os passos são descritos de uma forma fácil de entender. As próprias palavras e construções podem variar dependendo dos padrões que você está seguindo.
Se você quiser, pode implementar esses passos em JavaScript ou outras linguagens de programação seguindo a mesma lógica, já que o pseudocódigo é independente da linguagem de programação.
Neste ponto, você já pode ter percebido que este problema pode ser resolvido de muitas maneiras diferentes. Esta não é a única maneira de inverter uma string.
Mas lembre-se que escolher o algoritmo certo é importante.
Em uma lição anterior, você aprendeu sobre complexidade algorítmica e por que é importante escolher algoritmos que sejam eficientes em termos de tempo e espaço.
É aí que você terá um papel vital como desenvolvedor. Você precisará escolher o algoritmo mais eficiente para resolver o desafio.
Pensar sobre diferentes algoritmos disponíveis é uma habilidade importante de resolução de problemas que você deve praticar. Reserve um momento para se perguntar se a solução que você está propondo no seu pseudocódigo é a melhor ou não.
Por exemplo, existem muitos algoritmos diferentes para ordenar elementos, mas alguns deles são mais eficientes que outros. Bubble sort, por exemplo, é muito ineficiente para ordenar listas grandes, enquanto Quick Sort geralmente é mais eficiente.
Para o nosso desafio "Reverse a String", poderíamos usar qualquer uma dessas abordagens, assumindo que estamos planejando implementar nosso algoritmo em JavaScript:
* Usando métodos embutidos como .split(""), .reverse() e .join("") para retornar uma nova string invertida.
* Percorrendo os caracteres da esquerda para a direita e adicionando o novo caractere ao início da nova string.
* Convertendo a string em um array e invertendo manualmente com um loop antes de juntá-lo novamente em uma string.
Qual você deve usar? Essa é a sua escolha.
Tomar essas decisões com base no seu conhecimento e experiência pode fazer uma enorme diferença no desempenho final da sua aplicação. Considere diferentes abordagens, sua eficiência, implicações e implementação.
Pergunte a si mesmo:
* Como vou abordar esse problema?
* Quais estruturas de dados vou usar?
* São as estruturas de dados que escolhi as mais eficientes para o problema em questão?
* Estou cobrindo todos os possíveis casos de borda?
Casos extremos são entradas ou condições específicas e válidas que ocorrem nos limites do que um algoritmo deve processar.
Por exemplo, no desafio "Reverse a String", um caso limite seria receber uma string vazia como entrada. Você está lidando com isso corretamente? Se não, considere a melhor forma de lidar com esse caso limite e adicione-o ao seu pseudocódigo.
Então, uma vez que você esteja satisfeito com seu plano, você pode passar para a fase de implementação. Nesta fase, você implementará seu algoritmo em uma linguagem de programação.
Ao estruturar seu programa, você deve escrever código modular que seja fácil de ler e entender.
Use as ferramentas da linguagem de programação com base no seu conhecimento atual. Algumas linguagens de programação incluem soluções integradas para problemas e tarefas comuns. Use-os se possível.
Para ser consistente, siga as melhores práticas de Javascript ou da linguagem de programação de sua escolha.
Teste seu código enquanto o escreve e certifique-se de que está lidando com casos extremos adequadamente.
Depois que sua solução estiver implementada, verifique se ela funciona corretamente para todos os exemplos e potencialmente refatore seu código para torná-lo mais claro ou simples.
Voltar para a sua solução é muito importante. O desenvolvimento não é necessariamente um processo linear, passo a passo. Você sempre pode voltar ao seu código e usar suas habilidades de pensamento crítico para melhorá-lo.
Estas são algumas técnicas comuns de resolução de problemas que você pode seguir para abordar desafios algorítmicos. Se você praticar consistentemente, você desenvolverá gradualmente suas habilidades de resolução de problemas.Este módulo não possui perguntas. Marque como concluído.