Comment inverser un tableau (en C #) sans utiliser la méthode Array.Reverse()
?
Par exemple,
int[] arr = {1,3,4,9,8};
// some code here
Console.WriteLine(string.Join(",", arr));
devrait aboutir à
8,9,4,3,1
Je l'ai eu comme une tâche d'entrevue.
Le code à remplacer à la place de // some code here
dans la question est le suivant:
for (int i = 0; i < arr.Length / 2; i++)
{
int tmp = arr[i];
arr[i] = arr[arr.Length - i - 1];
arr[arr.Length - i - 1] = tmp;
}
Vous ne devriez parcourir que la première moitié du tableau (arr.Length / 2
). Si vous parcourez tout le tableau (arr.Length
), il sera inversé deux fois, donnant le même ordre d'élément qu'avant le début.
En gros, il vous est demandé de réimplémenter Array.Reverse(Array)
. Si vous regardez comment est implémenté dans le cadre lui-même et si vous ignorez de nombreux détails techniques, vous constaterez qu’il n’appelle que sa version à trois paramètres (qui inverse la partie spécifiée d’un tableau) sur l’ensemble du tableau.
Array.Reverse(Array,Int32,Int32)
est une boucle while qui échange des éléments et conserve deux index:
i
pointe vers le premier élément de la partie inversée, etj
pointe vers le dernier élément de la partie inversée. Réécrit pour être remplacé à la place de // some code here
dans la question:
int i = 0;
int j = arr.Length - 1;
while (i < j)
{
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
C’est plus facile à comprendre que l’implémentation utilisant for-loop fait moins d’arithmétique et évite élégamment l’accroche avec double retour.
for (int i = 0; i < array.Length - i; i++)
{
var value = array[array.Length - i - 1];
array[array.Length - i - 1] = array[i];
array[i] = value;
}
C’est la boucle So Simple Start de la longueur du tableau et ainsi de suite, surveillez le code et vous comprendrez :)))
int[] arr = new int[5] { 1, 2, 3, 4, 5 };
for (int i = arr.Length-1; i >= 0; i--)
{
Console.WriteLine(arr[i]);
}
int[] arr1 = {1,3,4,9,8};
int[] arr2 = new int[5];
int j = 0;
for(int i = arr1.Length - 1; i >= 0; i--)
{
arr2[j] = arr1[i];
j++;
}
Évidemment, vous pouvez simplement copier dans un nouveau tableau, dans l’ordre inverse.
Pour effectuer l'opération "en place", vous pouvez travailler des deux côtés vers le milieu: chargez le premier et le dernier élément, puis stockez-les dans le dernier emplacement et le dernier dans le premier. Ensuite, faites le deuxième et l'avant-dernier, etc. Si vous avez un nombre pair d'éléments, vous faites N/2 itérations. Si vous faites un nombre impair, faites (N-1)/2 itérations et laissez l'élément du milieu où il se trouvait.
Il existe probablement d'autres algorithmes qui seraient légèrement plus rapides si vous tenez compte de la taille de la ligne de cache et d'autres caractéristiques de la mémoire, mais ils n'en valent la peine que si vous vous trouvez dans une situation réellement critique en termes de performances.
char[] strx = { '1','2','3','4','5','6','7','8','9' };
int i = strx.Length;
string ktr ="";
while (i>0)
{
i--;
ktr += strx[i];
if (i==0)
{
i = strx.Length;
while (i > 0)
{
i--;
strx[i] = ktr[i];
}
}
}
int j;
Console.WriteLine("Array strx in reverse order: ");
for (j = 0; j < strx.Length; j++ )
{
Console.Write("{0}", strx[j]);
}
Vous pouvez le faire de différentes manières, du plus rapide au plus stupide, comme:
int[] arr = new int[] { 1,2,3 };
arr = (from a in arr orderby a descending select a).ToArray();
Mais je ne peux pas comprendre pourquoi vous poursuivez une quête aussi futile. Si c'est pour impressionner quelqu'un quelque part, utilisez ceci au lieu de la boucle for :)
essayez quelque chose comme:
var counter = 1;
var newArr = new int[arr.length];
for(int i = 0; i < arr.length; i++)
{
newArr[i] = arr[arr.length - counter];
counter++;
}
Je n'ai pas testé cela, mais ça devrait être sur la bonne voie. Une raison pour laquelle vous ne voulez pas utiliser Array.Reverse? C'est probablement une version bien optimisée de l'algorithme.
Je ne suis pas du tout bon en boucle. Mais c’est ce qui me semble simple -
int[] array1 = { 1, 2, 3, 4, 5 };
int[] reverseArray = new int[array1.Length];
for (int i = 0; i <= array1.Length - 1; i++)
{
reverseArray[i] = array1[array1.Length - i - 1];
}
// sans utiliser la méthode Reverse et sans utiliser de tableau supplémentaire // essayer l'opérateur renvoyer à partir du dernier élément
public IEnumerable<int> Reverse (int[] array)
{
for (int i = array.Length - 1; i >= 0; i--) {
yield return array [i];
}
}
Il vaut mieux utiliser la méthode Array.Reverse
int[] arr ={1,3,4,9,8};
Array.Reverse(arr);
Vous pouvez lire plus de description ici