web-dev-qa-db-fra.com

Inverser un tableau sans utiliser Array.Reverse ()

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.

9
Romil N

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.

32
Petar Minchev

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:

  1. i pointe vers le premier élément de la partie inversée, et
  2. j 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.

3
Palec
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;
 }
1

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]);
        }
1
Javidan Akberov
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++;
}
1
Kon

É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.

1
Hot Licks
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]);
}
1
Veljko Stefanovic

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 :)

1
Marino Šimić

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.

0
Fourth

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];
  }
0
Manoz

// 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];
    }
}
0
Max

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

0
Alireza