je veux trouver tous les éléments de séquence possibles de la liste en utilisant c #
les nombres sont dans l'ordre incrémentiel si c'est une séquence je dois diviser le tableau
Exemple de tableau: int [] array = {1 , 2,3,5,6,8,9,10}
Sortie attendue sous forme de toutes les listes de séquences possibles: {1,2,3}, {5,6}, {8,9,10 }
Quelqu'un peut-il m'aider à ce sujet?
code
for(int i=0;i<array.Length;i++)
{
if(array[i]== array[i+1])
{
// i want to get all possible sequence of elements
}
}
3 Réponses :
private static List<List<int>> FindSequence(int[] array)
{
var result = new List<List<int>>();
var tempList = new List<int>{array[0]};
var lastResult = array[0];
for (var i = 1; i < array.Length; i++)
{
if(lastResult + 1 == array[i])
tempList.Add(array[i]);
else
{
result.Add(tempList);
tempList = new List<int> {array[i]};
}
lastResult = array[i];
}
result.Add(tempList);
return result;
}
I've used List<List<int>>, that could be changed to List<int[]> if you want to.
S'il y a une valeur max qui n'est pas très grande, et seulement pour zéro ou plus, j'utiliserais un tableau Aux auxArray [maxValue] de zéros, passer en revue le tableau de nombres une fois et mettre à jour toute la valeur crrent dans le auxArray à un. auxArray [tableau [i]] = 1; alors je passerais en revue le auxArray une fois et pour chaque 1 trouvé dans le tableau continue jusqu'à ce que vous atteigniez un zéro. et le groupe suivant commencera une fois que vous en aurez trouvé un autre.
exemple sur la façon de remplir le tableau:
arr[0,1,5,6];
auxArray[6] = {0};
for(i=0; i< 4; ++i)
{
auxArray[array[i]] =1;
}
donc maintenant tout ce que vous avez à faire est une boucle for ( i = 0; i
Une autre façon de procéder est d'obtenir la valeur min suivante de le tableau des nombres. s'il est supérieur de un à la dernière valeur minimale, ils vont ensemble. sinon, commencez un nouveau lot de nombres.
Une troisième façon de procéder est de trier le tableau. puis passez en revue et vérifiez que la différence est de 1 pour le même groupe.
Encore une autre implémentation:
public static IEnumerable<IEnumerable<int>> FindSequences(IEnumerable<int> input, int step = 1)
{
int currentIndex = -1;
int sequenceStartIndex = -1;
int lastValue = 0;
foreach (int i in input)
{
++currentIndex;
if (currentIndex == 0)
{
sequenceStartIndex = 0;
lastValue = i;
continue;
}
if (lastValue + step != i)
{
yield return input.Skip(sequenceStartIndex).Take(currentIndex - sequenceStartIndex);
sequenceStartIndex = currentIndex;
}
lastValue = i;
}
if (currentIndex > -1) //collection was not empty
{
yield return input.Skip(sequenceStartIndex).Take(currentIndex - sequenceStartIndex + 1);
}
}
List Électeur à la baisse, pourriez-vous expliquer le raisonnement derrière votre vote?
N'a pas voté (vers le bas), mais le streaming des résultats ne nécessiterait-il pas que cette méthode soit asynchrone?
@MarkCiliaVincenti par streaming, je voulais dire récupération sur demande. Lorsque vous foreach le résultat d'un IEnumerable 'yield-returned', une nouvelle instance IEnumerator est créée, et il est possible que le IEnumerator est supprimé / collecté avant le dernier élément (par exemple lors de la sortie de la boucle sur une condition particulière). Dans ce cas, le reste des éléments n'aura pas à être récupéré.
S'il manque
Xn, vous devez vous séparer, non? Qu'avez-vous essayé et qu'est-ce qui ne fonctionne pas? Pourquoi obtenez-vous 2 votes positifs?