J'ai un tableau qui porte des nombres entiers. Dites, numbers={3,0,1}
ou dites, numbers={9,6,4,2,3,5,7,0,1}
. Maintenant, je dois trouver les numéros manquants dans le tableau. Selon cet exemple, il ne manque qu'un seul numéro dans chaque ensemble. Le premier manque 2 et le deuxième manque 8.
Je l'ai déjà codé. Mon code recherche non seulement un numéro manquant dans l'ensemble spécifié, il peut également détecter plus d'un numéro manquant dans un ensemble donné.
Mais si deux numéros consécutifs manquent dans le même ensemble, il ne parvient pas à savoir .
My code
import Java.util.Arrays;
public class Missing_number
{
public static void main( String args[] )
{
int numbers[]={9,6,4,5,7,0,1};
Arrays.sort(numbers);
int i=1;
while ( i < numbers.length )
{
if ( numbers[i] - numbers[i-1] == 1 )
{
}
else
{
System.out.println( "Missing number is " + ( numbers[i-1] + 1 ) );
}
i++;
}
}
}
Je pense comme ça si je peux ajouter le premier nombre manquant dans le tableau et ensuite commencer à chercher, à quoi ressemble le code? numbers={9,6,4,5,7,0,1}
Maintenant, 8 est déjà absent de cet ensemble. Maintenant, j'ai terminé deux autres éléments (2,3) de la liste. Sortie: selon mon code: 2,8 Mais il manque aussi 3 mais cela ne s’affiche pas.
Je pense que si je suis capable d’ajouter 2 dans un tableau de nombres, cela sera peut-être un peu plus facile. Mais comme nous le savons tous, le tableau Java est immuable et nous ne pouvons donc pas en augmenter la longueur.
Donc, je vais peut-être utiliser List . Mais dans la liste, ce type d'indexation number[0]=something
n'est pas pris en charge. Alors, comment pourrais-je procéder alors. Est-ce que j'utilise la liste ou je suis toujours bloqué dans un tableau?
Je tente donc de le créer avec un artiste.
Mycode(modified version from array)
public class T1 {
public static void main(String args[]){
List<Integer> numbers=new ArrayList<>();
numbers.add(9);
numbers.add(6);
numbers.add(4);
numbers.add(5);
numbers.add(7);
numbers.add(0);
numbers.add(1);
Collections.sort(numbers);
int i=1;
while(i< numbers.size()) {
if (numbers.get(i) - numbers.get(i-1) == 1) {
} else {
System.out.println("Missing number is " + (numbers.get(i-1) + 1));
numbers.add((numbers.get(i-1)+1));
Collections.sort(numbers);
}
i++;
}
}
}
Arraylist peut résoudre mon problème. Mais existe-t-il une possibilité qu'un simple tableau puisse résoudre ce problème?
Ce code utilise une HashSet
:
public static void main(String[] args) {
int[] numbers = {9, 6, 4, 5, 7, 0, 1};
Arrays.sort(numbers);
HashSet<Integer> set = new HashSet<>();
for (int i = numbers[0]; i < numbers[numbers.length - 1]; i++) {
set.add(i);
}
for (int i = 0; i < numbers.length; i++) {
set.remove(numbers[i]);
}
for (int x : set) {
System.out.print(x + " ");
}
}
imprimera:
2 3 8
Voici comment cela fonctionne:
1. Ajoute tous les nombres du nombre minimum du tableau au nombre maximum du tableau à l'ensemble.
2. Parcourt le tableau et supprime chaque élément du tableau de l'ensemble.
3. Imprime les éléments restants dans l'ensemble, qui sont tous les éléments manquants du tableau.
remplace la clause else
par:
for(int j=numbers[i-1] + 1; j <= numbers[i] - 1; j++) {
System.out.println( "Missing number is " + ( j ) );
}
examinons le cas: {9, 6, 4, 5, 7, 0, 1} après l'avoir trié: {0, 1, 4, 5, 6, 7, 9} maintenant si i
est à l'index 2, la différence entre numbers[i]
et numbers[i-1]
n'est pas égale à 1 (4 - 1 = 3), vous avez maintenant besoin de TOUS les nombres compris entre 1 et 4 qui sont 2, 3 et vous devez donc passer de numbers[i-1]
à numbers[i]
exclusif) pour y parvenir.
La complexité de ce code est énorme: O de N
(O(N))
, où N
est le plus gros élément de votre tableau.
Il y a beaucoup de questions qui sont sans réponse ici. Par exemple, Est-ce qu'un tableau commence toujours par zéro?, Quelle est la taille maximale possible? etc.
Voici un moyen simple d'aborder ce problème,
boolean
vide de longueur comme celui du nombre maximum que vous avez trouvé à la dernière étape plus un.true
.boolean
pour trouver et afficher tous les index avec la valeur false
.Exemple:
Jeu d'origine: {1,0,3}
boolean
, ce sera l'état final -> {true, true, false, true}boolean
pour imprimer 2 puisqu'il s'agit uniquement de l'index dont la valeur est = false
int[] numbers = { 11, 6, 4, 5, 7, 1 };
Arrays.sort(numbers);
int numbersArrayIndex = 0;
for (int i = 0; i < numbers[numbers.length - 1]; i++) {
if (i == numbers[numbersArrayIndex]) {
numbersArrayIndex++;
}
else {
System.out.println(i);
}
}