2

HackerRank #40 | Java Dequeue | 🇧🇷

 2 years ago
source link: https://dev.to/beatrizmaciel/hackerrank-40-java-dequeue--497h
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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.

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 modeExit 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:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK