Utilizando as classes de coleções vistas em aula, determine a(s) mais apropriada(s) para resolver os problemas a seguir.

Estruturas de dados obviamente não são necessárias para resolver alguns dos problemas a seguir e talvez até compliquem a solução. Mas, para o contexto desses exercícios, pense na solução com o uso das estruturas de dados aprendidas.

1. Crie um programa que recebe duas strings e verifica se uma é anagrama da outra (ex: "roma" e "amor"). Ignore espaços e diferenças entre maiúsculas e minúsculas. Qual estrutura de dados você escolheria para resolver esse problema de forma eficiente? Justifique.


2. Contagem de Palavras e Ranking Escreva um programa que recebe um texto e exibe as 5 palavras mais frequentes em ordem decrescente de ocorrência. Ignore pontuação e diferenças entre maiúsculas e minúsculas. Qual estrutura você usaria para contar as ocorrências? E para ordenar o resultado?


3. Implementação de uma Pilha com Suporte a mínimo Implemente uma pilha que, além das operações push, pop e peek, suporte a operação min(), que retorna o menor elemento da pilha em O(1) — ou seja, sem percorrê-la. Dica: use duas pilhas.


4. Detecção de Elementos em Comum Dado duas listas de inteiros fornecidas pelo usuário, exiba os elementos que aparecem nas duas listas, sem repetição, na ordem em que aparecem na primeira lista. Qual estrutura você usaria para tornar a busca eficiente?


5. Dicionário com Histórico de Alterações Crie um dicionário que mapeie palavras aos seus significados. Além das operações básicas de inserção, remoção e consulta, mantenha um histórico das últimas 5 operações realizadas (ex: "inseriu 'efêmero'", "removeu 'obtuso'"). Qual estrutura usaria para o histórico?


6. Remoção de Duplicatas(Incorporado ao exercício 4)


7. Fila de Impressão com Prioridade e Cancelamento Implemente uma fila de impressão onde cada documento tem nome, prioridade e tamanho (em páginas). Documentos de maior prioridade são impressos primeiro; em caso de empate, o que chegou antes é impresso primeiro. Implemente também uma operação de cancelamento que remove um documento da fila pelo nome, mesmo que ele não esteja no topo.


8. Frequência de Caracteres com Ordenação Crie um programa que conta a frequência de cada caractere em uma string (ignorando espaços) e exibe os caracteres em ordem decrescente de frequência. Em caso de empate na frequência, ordene alfabeticamente. Qual estrutura você usaria para contar? E para ordenar?


9. Ordenação de Alunos com Múltiplos Critérios Crie uma classe Aluno com campos nome, nota e turma. Crie uma lista de alunos e ordene-a pelos seguintes critérios, nessa ordem: primeiro por turma (alfabética), depois por nota (decrescente) e, em caso de empate, por nome (alfabética). Use Comparator e o método thenComparing.