web-dev-qa-db-fra.com

Découvrez n nombres d'éléments manquants dans un tableau en java

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?

11
Encipher

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.

6
forpas

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.

4
Mis94

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,

  • Trouvez le nombre maximum dans votre ensemble.
  • Créez un tableau boolean vide de longueur comme celui du nombre maximum que vous avez trouvé à la dernière étape plus un.
  • Analysez votre ensemble d'origine et définissez la valeur de votre nouveau tableau booléen sur un index égal à celui de votre ensemble d'origine, sous la forme true.
  • Enfin, analysez votre tableau boolean pour trouver et afficher tous les index avec la valeur false.

Exemple:

Jeu d'origine: {1,0,3}

  • Étape 1: Nombre maximum dans l'ensemble = 3
  • Étape 2: Tableau booléen de longueur = 3 + 1 -> {false, false, false, false}
  • Étape 3: Lors du balayage du jeu d'origine et des valeurs du tableau boolean, ce sera l'état final -> {true, true, false, true}
  • Étape 4: Vous allez enfin scanner le tableau boolean pour imprimer 2 puisqu'il s'agit uniquement de l'index dont la valeur est = false
1
user2004685
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);
    }
}
0
tech