Algoritmo: Jolly Jumpers

Uma sequência de n> 0 inteiros é chamada de jumper jolly se os valores absolutos das
diferenças entre os elementos sucessivos assumem todos os valores possíveis de 1 a n – 1. Por
exemplo,
1 4 2 3
é um jumper jolly, porque as diferenças absolutas são 3, 2 e 1, respectivamente. A
definição implica que qualquer sequência de um único inteiro é um jumper jumper. Escreva um programa
para determinar se cada uma das várias sequências é um jumper jumper.

Entrada
Cada linha de entrada contém um inteiro n <3, 000 seguido por n inteiros que representam a
sequência.

Saída
Para cada linha de entrada, gere uma linha de saída dizendo “Alegre” ou “Não alegre”.

Amostra de entrada
4 1 4 2 3
5 1 4 2 -1 6
Amostra de saída
Jolly
Not jolly

Solução:
Precisamos nos concentrar no fato de que a diferença em números consecutivos deve abranger todos os números de 1 a n-1.
O coração da solução está em selecionar uma estrutura de dados cujo valor em um índice correspondente a i (1 <= i <n) será definido
se o valor absoluto da diferença entre os números consecutivos for i. Os valores absolutos das diferenças não cobrirão
o intervalo de 1 a n-1 se algum dos valores de diferença for repetido ou qualquer diferença ficará fora do intervalo
de 1 a n-1 e não haverá necessidade de verificar os números ainda mais.

Abaixo está o código da solução:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.BitSet;

public class JollyJumpers {

/**
*
@param args
* @throws IOException

*/

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = "";
//read the input from the console
while ((input = br.readLine()) != null && !input.trim().equals("n") && !input.trim().equals(""))
{
String[] data = input.split("\s+");

int numberOfInputs = Integer.parseInt(data[0]);

if ((data.length - 1) != numberOfInputs)
{
System.out.println("Wrong input. Exiting....");
System.exit(1);
}
BitSet bitSet = new BitSet(numberOfInputs);

boolean isJolly = true;

for(int i = 1; i< data.length-1; i++)
{
int diff = Math.abs(Integer.parseInt(data[i]) - Integer.parseInt(data[i+1]));
if (diff < 1 || diff >= numberOfInputs || bitSet.get(diff))
{
System.out.println("Not Jolly");
isJolly
= false;
break;
}
bitSet
.set(diff);
}
if(isJolly)
{
System.out.println("Jolly");
}
}
}

}

Tagged