DEV Community

Beatriz Maciel
Beatriz Maciel

Posted on

HackerRank #40 | Java Dequeue | 🇧🇷

Esse exercício recebe dois inputs iniciais: um integer N, relativo à quantidade de números em um array, e um integer M, relativo a um subarray deslocável que fará a "varredura" dentro do array principal.

HackerRank Dequeue Imagem

N = quantidade de números do array
M = tamanho do subarray que varrerá o array principal

Dessa forma, os arrays estruturados com M = 3 serão:

[5, 3, 5]
. . . [3, 5, 2]
. . . . . [5, 2, 3]
. . . . . . . [2, 3, 2]

Como todos os subarrays precisam ter M números, nesse caso esses serão os subarrays possíveis.

Depois disso, precisamos que o programa contabilize qual é o máximo de números únicos existentes em um subarray de tamanho M.

[5, 3, 5] = 2 números únicos
[3, 5, 2] = 3 números únicos
[5, 2, 3] = 3 números únicos
[2, 3, 2] = 2 números únicos

Sendo assim, o máximo de números únicos em um subarray será 3. Esse precisa ser o output.

Vamos para a solução, dividida em partes:

  • Primeiro declaramos um Array de Integers de nome deque.
  • Declaramos também um Hashset de Integers de nome hashset. Lembrando que um Hashset não repete números, e isso vai ser útil para que possamos contabilizar números únicos.
  • Depois escaneamos os ints N, M e maxUniqueIntegers (nossa resposta final)
  • Dentro de uma iteração, pegaremos, através de um input, os números do array. Lembrando: a quantidade de números do array é delimitada por N, mas será inserida pelo usuário.
  • Vamos adicionar todos os números do input no Array deque e no Hashset hashset através do .add
  • Faremos uma condicional que diz que nosso Array deque, tendo o mesmo tamanho de M, fará com que o hashset receba o maxUniqueIntegers para ir contabilizando as entradas de números únicos. Como o hashset só permite números únicos, o maxUniqueIntegers também só receberá a quantidade de números únicos.
  • Depois, declararemos uma variável firstQueueNumber que fará a remoção do primeiro número do nosso array deque. A propriedade .remove sempre remove o primeiro elemento, ou o elemento que tem a menor posição i (leia mais sobre isso nas referências)
  • Por fim, imprimimos o maxUniqueNumbers, com a quantidade de números únicos.

O código final fica assim:

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Deque<Integer> deque = new ArrayDeque<>();
        HashSet<Integer> hashset = new HashSet<>();

        int n = in.nextInt();
        int m = in.nextInt();
        int maxUniqueIntegers = 0;

        for (int i = 0; i < n; i++) {
            int num = in.nextInt();

            deque.add(num);
            hashset.add(num);

            if (deque.size() == m) {
                if (hashset.size() > maxUniqueIntegers) {
                    maxUniqueIntegers = hashset.size();
                }
                int firstQueueNumber = deque.remove();
                if (!deque.contains(firstQueueNumber)) {
                    hashset.remove(firstQueueNumber);
                } 
            }
        }

        System.out.println(maxUniqueIntegers);
    }
}
Enter fullscreen mode Exit fullscreen mode

=======

Referências:

ArrayList : Oracle

============

Essa publicação faz parte de uma série de exercícios resolvidos em Java no HackerRank. Acesse a série completa:

Discussion (0)