A solução acima só funciona se todos os números estiverem em ordem.
Mas se tiver menos números (ex: apenas 1 e 2, em ordem), ele não valida o tamanho e retorna true
, ou se tiver todos de 1 a 9 mas não estão em ordem crescente, aí não funciona mais, veja: https://ideone.com/FiKM1a
Enfim, os números estarão ordenados ou não?
Se estiverem, basta incluir no código acima uma verificação do tamanho, vendo se é 9.
Mas se puderem estar em qualquer ordem, aí já não serve mais…
Uma opção para este caso é ordenar o array primeiro:
public static boolean contem1a9(int[] v) {
// se não tem 9 elementos, nem precisa verificar nada
if (v.length != 9)
return false;
Arrays.sort(v);
for(int i = 0; i < v.length; i++) {
if (v[i] != i + 1) {
return false;
}
}
return true;
}
O único problema é que esse método altera o array original:
int v[] = {3, 1, 5, 7, 8, 4, 9, 2, 6};
System.out.println(contem1a9(v)); // true
// mas agora o array está ordenado
System.out.println(Arrays.toString(v)); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
Se não quiser modificar o array, você pode ou fazer uma cópia dele:
public static boolean contem1a9(int[] v) {
// se não tem 9 elementos, nem precisa verificar nada
if (v.length != 9) {
return false;
}
// cria uma cópia
int[] copia = Arrays.copyOf(v, v.length);
Arrays.sort(copia);
for (int i = 0; i < copia.length; i++) {
if (copia[i] != i + 1) {
return false;
}
}
return true;
}
Ou então crie um outro array contendo as ocorrências de cada número (na posição i
do array tem a informação se o número i + 1
ocorreu):
public static boolean contem1a9(int[] v) {
// se não tem 9 elementos, nem precisa verificar nada
if (v.length != 9) {
return false;
}
// array que indica se um número já ocorreu (por default é inicializado com false)
boolean [] jaOcorreu = new boolean[v.length];
for (int i = 0; i < v.length; i++) {
int n = v[i];
if (n < 1 || n > 9) {
return false;
}
if (jaOcorreu[n - 1]) { // se o número já ocorreu antes, então está repetido
return false;
}
jaOcorreu[n - 1] = true;
}
return true;
}
Alguns testes:
// true
System.out.println(contem1a9(new int[]{3, 1, 5, 7, 8, 4, 9, 2, 6}));
// false (o 7 está repetido)
System.out.println(contem1a9(new int[]{3, 1, 5, 7, 8, 4, 9, 2, 7}));
// false (não tem 9 números)
System.out.println(contem1a9(new int[]{1, 2, 3}));
// false (tem número maior que 9)
System.out.println(contem1a9(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 11}));