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
emaxUniqueIntegers
(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 noHashset 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);
}
}
=======
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:
- HackerRank #6 | Scanner e End-of-file
- HackerRank #7 | Int to String / String to Int
- HackerRank #8 | Date and Time
- HackerRank #9 | Static Initializer Block
- HackerRank #10 | Currency Formatter
- HackerRank #11 | DataTypes
- HackerRank #12 | Strings Introduction
- HackerRank #13 | Substring Comparisons
- HackerRank #14 | Abstract Class
- HackerRank #18 | BigInteger
- HackerRank #19 | Loops II
- HackerRank #20 | String Reverse
- HackerRank #23 | Instanceof keyword
- HackerRank #26 | Generics
- HackerRank #27 | 1D Array
- HackerRank #28 | Anagrams
- HackerRank #33 | Arraylist
- HackerRank #34 | Exception Handling Try / Catch
- HackerRank #36 | Exception Handling
- HackerRank #37 | List
- HackerRank #38 | SubArray
- HackerRank #39 | HashSet
- HackerRank #40 | Java Dequeue
Top comments (0)