2010-05-23 4 views
0

J'ai un tableau à une dimension qui remplit une table de 40 éléments aléatoires (toutes les valeurs sont 0 ou 1). Je veux trouver la plus longue série de valeurs consécutives.Tableau à 1 dimension comptant les mêmes éléments

Par exemple:

En 111100101 la plus longue rangée serait 1111 parce qu'il a quatre valeurs consécutives de 1. En 011100 le résultat est 111.

Je n'ai aucune idée comment vérifier sur le "prochain élément" et vérifier si c'est un 0 ou 1. Comme le premier serait 1111 (compte 4) mais le prochain serait une valeur 0, ce qui signifie que je dois arrête de compter.

Mon idée était de placer cette valeur (4) dans un autre tableau (exemple: 111100101), et de placer la valeur de 1 sur zéro. Et recommencez le processus.

Pour trouver la plus grande valeur, j'ai fait une autre méthode qui vérifie la plus grande valeur dans le tableau qui garde la trace du nombre de 0, ce n'est pas le problème.

Mais je ne trouve pas un moyen de remplir le tableau tabelLdr up, ayant toutes les valeurs du groupe d'éléments de même nature (étant 0 ou 1).

Dans le code ci-dessous je 2 si ce et bien sûr, il ne sera jamais dans le second cas (pour vérifier si la valeur suivante du tableau est! = À son état actuel (valant 0 ou 1).

public void BerekenDeelrij(byte[] tabel, byte[] tabelLdr) 
{ 
    byte LdrNul = 0, Ldréén = 0; 
    //byte teller = 0; 

    for (byte i = 0; i < tabel.Length; i++) 
    { 
     if (tabel[i] == 0) 
     { 
      LdrNul++; 
      //this 2nd if cleary does not work, but i have no idea how to implend this sort of idea in my program. 
      if (tabel[i] == 1) //if value != 0 then the total value gets put in the second array tabelLdr, 
      { 
       tabelLdr[i] = LdrNul; 
       LdrNul = 0 
      } 
     } 

     if (tabel[i] == 1) 
     { 
      Ldréén++; 
      if (tabel[i] == 0) 
      { 
       tabelLdr[i] = Ldréén; 
       Ldréén = 0; 
      } 
     } 

    }/*for*/ 
} 

Répondre

1

Cette méthode devrait faire ce que vous avez besoin:

public int LargestSequence(byte[] array) { 
    byte? last = null; 
    int count = 0; 
    int largest = 0; 
    foreach (byte b in array) { 
    if (last == b) 
     ++count; 
    else { 
     largest = Math.Max(largest, count); 
     last = b; 
     count = 1; 
    } 
    } 
    return Math.Max(largest, count); 
} 
0

Même si i est le compteur de boucle, il est encore juste une variable. une déclaration for valide est for (;;), qui est une boucle infinie. Notez les incréments de déclaration fori, comme dans i++. l'expression i = i + 1 fonctionne aussi bien

0

Im pas sûr si vous avez besoin le plus long « ligne » de ceux ou plus longue rangée de 0 ou 1. Cela fonctionne pour ce dernier

var max = 0; 
var start = 0; 
var current = -1; 
var count = 0; 
for(int i = 0;i<table.Length;i++) 
{ 
    if(current = table[i]) 
    { 
     count++; 
    } 
    else 
    { 
     current = table[i]; 
     if(max < count) 
     { 
     max = count; 
     start = i-count; 
     } 
     count = 1; 
    } 
} 

if(max < count) 
     { 
     max = count; 
     start = i-count; 
     } 

// max est la longueur de la ligne commençant au début;

Questions connexes