Desafio de Estruturas de Dados e Algoritmos: #1

Introdução 📜

Este desafio foi desenhado para programadores iniciantes, e também os mais experientes que desejam acrescentar os seus conhecimentos sobre a implementação de algumas estruturas de dados e algoritmos. As soluções não estarão restritas à nenhuma linguagem de programação específica, os nossos moderadores encorajam todos os participantes a usar as linguagens de programação de sua preferência.

Submissão 🚀

As soluções desenvolvidas devem ser partilhadas no canal #code-drop no discord, posteriormente, as melhores soluções serão colocadas neste repo e os devs receberão kudos no twitter ou outra rede social de sua preferência.

Dicas importantes

  1. Não te esqueças de formatar o teu código antes de o enviar à communidade, para mais informações visite => discord.
  2. Use funções no teu programa sempre que necessário para a reutilização de códigos e simplificação dos programas.
  3. Resolva os teus exercícios streaming live (ajuda-te a ganhar mais pontos)
  4. Desenvolva e partilhe o seu pseudocódigo(algoritimo) junto da tua submissão.

Challenge 🥋

Os challenges (desafios) começarão do mais simples ao mais arduo, mas poderás resolver-los de forma aleatória. Esse challenge será composto por 4 problemas sendo que os mesmos ajudarão o participante à desenvolver algum skill específico.

Challenge #1 - Fila(Queue) 🧊

Fila é uma estrutura de dados linear que nos permite processar elementos dependendo da ordem na qual foram adicionados, regra esta é: Os primeiros a serem adicionados à fila, serão os primeiros a serem atendidos ou executados, ou seja Primeiro dentro, Primeiro Fora(FIFO). Filas são muito usadas quando precisamos processar informações em serie(uma atrás da outra, do primeiro ao último).

Implememente uma Fila com os seguintes metodos:

  • isEmpty: Método verificar se a fila está vazia.
  • enqueue: Método para adicionar novos elementos à fila.
  • dequeue: Método para remover o ultimo elemento da fila.
  • print: Método imprimir todos os elementos da fila.

Exemplo:

// Inicializando a Fila
const queue = new Queue();

// Adicionando novos elementos
queue.enqueue(2);
queue.enqueue(1);
queue.enqueue(5);

// Removendo elementos
queue.dequeue();
queue.dequeue();

// Imprimindo 
queue.print(); // imprime: 5

// Verificando se a fila está vázia
queue.isEmpty(); // imprime: false

Challenge #2 - Pilha(Stack) 🧊

Pilha é uma estrutura de dados linear que nos permite processar elementos dependendo da ordem na qual foram adicionados, regra esta é: Os últimos a serem adicionados à fila, serão os primeiros a serem atendidos ou executados. Pilhas são muito usadas quando precisamos processar informações em serie(uma atrás da outra, do último ao primeiro).

Implememente uma Pilha com os seguintes metodos:

  • isEmpty: Método verificar se a pilha está vazia.
  • push: Método para adicionar novos elementos à pilha.
  • pop: Método para remover o ultimo elemento da pilha.
  • print: Método imprimir todos os elementos da pilha.

Exemplo:

// Inicializando a Fila
const stack = new Stack();

// Adicionando novos elementos
stack.push(2);
stack.push(1);
stack.push(5);

// Removendo elementos
stack.pop();
stack.pop();

// Imprimindo 
stack.print(); // imprime: 2

// Verificando se a pilha está vázia
stack.isEmpty(); // imprime: false

Challenge #3 - Lista Ligada(Linked-List) 🧊

Lista Ligada é uma estrutura de dados linear e dinâmica. Ela é composta por células que apontam para o próximo elemento da lista. Para "ter" uma lista ligada/encadeada, basta guardar seu primeiro elemento, e seu último elemento aponta para uma célula nula. O esquema a seguir representa uma lista ligada/encadeada com 5 elementos. Fonte: Wikipedia

Implememente uma Lista Ligada com os seguintes métodos:

  • insert: Método para inserir novos elementos à lista.
  • remove: Método para remover o ultimo elemento da lista.
  • print: Método imprimir todos os elementos da lista.

Exemplo:

// Inicializando a Fila
const lista = new ListaLigada();

// Adicionando novos elementos
lista.insert(2);
lista.insert(1);
lista.insert(5);

// Removendo elementos
lista.remove(2);
lista.remove(5);

// Imprimindo 
lista.print(); // imprime: 1

// Verificando se a lista está vázia
lista.isEmpty(); // imprime: false

Challenge #4 - Lista Ligada Circular 🧊

Defina uma estrutura de dados utilizando o conceito de uma lista ligada circular, onde o último elemento nos leva sempre ao primeiro elemento, como no exemplo a seguir:

A Lista tem os elementos { A, B, C, D } mas é apenas representada por um nó (um único elemento), onde através dele podemos acessar outros elementos.

Para esse caso concreto, a partir de A podes ir para B, de B podes ir à C e de C podes voltar à A, cada nó armazenará o seu valor e a referência do seu próximo (caso seja o último armazenará a referência do primeiro).

Challenge #5 - Árvore de pesquisa binária(BST - Binary Search Tree) 🧊

BST é uma estrutura de dados de árvore binária baseada em nós, onde todos os nós da subárvore esquerda possuem um valor numérico inferior ao nó raiz e todos os nós da subárvore direita possuem um valor superior ao nó raiz (esta é a forma padrão, podendo as subárvores serem invertidas, dependendo da aplicação) Fonte: Wikipédia

Implememente uma BST com os seguintes metodos:

  • isEmpty: Método verificar se a árvore está vazia.
  • insert: Método para adicionar novos elementos à árvore.
  • find: Método para pesquisar determinado valor na árvore.
  • remove: Método remover determinado valor da árvore.

Exemplo:

// Inicializando a Fila
const bst = new BinarySearchTree();

// Adicionando novos elementos
bst.insert(2);
bst.insert(1);
bst.insert(5);

// Removendo elementos
bst.remove(2)
// Imprimindo 
bst.find(2); // imprime: true

// Verificando se a árvore está vázia
bst.isEmpty(); // imprime: false

Challenge #6 - Fundir duas Listas Ligadas(ordenadas) 🧊

Dada uma lista ligada com os elementos (3, 5, 9, 12) e uma outra com os elementos (2, 4, 10, 15). Crie um algoritmo que percorra as duas listas ligadas e retorna uma nova lista ligada com os elementos re-ordenados: (2, 3, 4, 5, 9, 10, 12, 15)

Exemplo:

const listaA = new ListaLigada();
const listaB = new ListaLigada();

listaA.insert([3, 5, 9, 12]);
listaB.insert([2, 4, 10, 15]);

const novaLista = mergeLists(listaA, listaB);
print(novaLista); // 2, 3, 4, 5, 9, 10, 12, 15