Énoncé

Écrire un programme Java appelé SeqOne qui demande à l'utilisateur une taille de tableau, crée un tableau de la longueur demandée contenant uniquement les chiffres 0 et 1 (le contenu doit être aléatoire), puis détermine et affiche la distribution des longueurs des séquences de 1 présentes dans un tableau contenant uniquement les entiers 0 et 1. Considérons par exemple le tableau [0, 1, 1, 1, 0, 0, 1, 1]. Il contient :

  1. 5 séquences de longueur 1 ;
  2. 3 séquences de longueur 2 (on compte ainsi les séquences qui se recouvrent et donc 111 compte pour 2 séquences) ;
  3. 1 séquence de longueur 3.

Correction

package org.apiacoa.teaching.oop;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class SeqOne {

    public static void main(String[] args) {
	Scanner scan = new Scanner(System.in);
	int n = 0;
	while (n <= 0) {
	    System.out.print("Entrez la taille du tableau : ");
			n = scan.nextInt();
	}
	int[] tableau = new int[n];
	// remplissage par des O et 1
	Random rng = new Random();
	for (int i = 0; i < tableau.length; i++) {
	    tableau[i] = rng.nextInt(2);
	}
	// affichage de contrôle
	System.out.println(Arrays.toString(tableau));
	// on cherche des séquences de 1
	// pour l'instant, on n'a pas vu de séquence
	int longueur = 0;
	// et on n'est donc pas dans une séquence
	boolean dansSequence = false;
	// au pire, on peut avoir une séquence aussi longue que le tableau
	// la case i de nombres indique le nombre de séquences de longueur i+1
	int[] nombres = new int[tableau.length - 1];
	for (int i = 0; i < tableau.length; i++) {
	    if (dansSequence) {
		if (tableau[i] == 1) {
		    // un de plus
		    longueur++;
		    if (i == tableau.length - 1) {
			// dernière case
			dansSequence = false;
		    }
		} else {
		    // fin de la séquence
		    dansSequence = false;
		}
		if (!dansSequence) {
		    System.out.printf("On a trouvé une séquence de longueur %d %n", longueur);
		    // mise à jour des comptages
		    for (int j = 0; j < longueur; j++) {
			nombres[j] += longueur - j;
		    }
		    longueur = 0;
		}
	    } else {
		if (tableau[i] == 1) {
		    // démarrage
		    longueur = 1;
		    dansSequence = true;
		}
	    }
	}
	// affichage des résultats
	if (nombres[0] == 0) {
	    System.out.println("Aucune séquence trouvée");
	} else {
	    System.out.println("Le tableau contient :");
	    int i = 0;
	    while (i < nombres.length && nombres[i] != 0) {
		System.out.printf("- %d séquence(s) de longueur %d%n", nombres[i], i + 1);
		i++;
	    }
	}

	scan.close();
    }

}