vamos la
vc vai ler até que surge um numero negativo, então estamos falando de um laço do { } while ( ! pare ); onde pare é uma variavel booleana que vc inicializa com false fora do laço e verifica a cada inteiro X lido se isso é negativo ( pare = X < 0; né? ).
agora como mostrar q 5 teve 3 repetições? existem algumas tecnicas e algumas vão usar estruturas de dados mais avançadas, outras mais simples.
Uma forma simples é vc criar um Set chamado visitados ( Set é uma interface então vc pode usar um HashSet por exemplo como implementação ) e fazer um loop:
pega o primeiro
verifica se o primeiro esta contido no Set visitados. se sim vai pro proximo
inicia o contador em zero
varre o array em um sub-loop desde o segunto até o fim
nesse segundo loop vc incrementa um contador toda a vez que o primeiro aparecer
chegou ao fim, imprime o contador.
adiciona primeiro ao Set visitados.
continua o loop.
se vc não pode usar um Set, vc pode emular usando um Array, mas vc precisa estabelecer um limite. por exemplo se estamos falando de digitos, vc pode assumir que um array de boolean’s visitados tem posições de 0 a 9 e pode conter true ou false ( tudo false no começo ) , assim se vc fizer visitados[5] = true; significa ‘5 ja foi visitado’. mas pelo que eu vi vc pode ter 10. nesse caso vc pode fazer umas mutretas
-
use Integer.MAX_VALUE como tamanho do array ( isso vai suportar todos os inteiros porem vai usar uma boa memoria, felizmente os computadores fazem isso sorrindo hoje ( convem testar )
-
vc pode usar short ao inves de int e isso vai ate 32,767 ( bem menor ). se ninguem digitar 50000 ta sussa
-
usar uma lista encadeada ( e ai fica mais complexo, talvez vc não tenha aprendido o que fazer com isso )
-
usar um Map<Int, Int> para armazenar como chave o numero que foi digitado e o valor a quantidade de ocorrencias e vc incrementa a cada vez que le um numero ( o que esconde a complexidade ).
boa sorte