Reverse an array without using Array.Reverse()
The code to be substituted in place of // some code here
in the question is:
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;}
You should iterate only through the first half of the array (arr.Length / 2
). If you iterate through the whole array (arr.Length
), it will be reversed twice, yielding the same element order as before it started.
Basically, you are asked to reimplement Array.Reverse(Array)
. If you look at how it is implemented in the framework itself and ignore many technical details around, you’ll find that it just calls its three-parameter version (which reverses specified part of an array) on the whole array.
Array.Reverse(Array,Int32,Int32)
is a while-loop that swaps elements and maintains two indexes:
i
points to the first element of the reversed part, andj
points to the last element of the reversed part.
Rewritten to be substituted in place of // some code here
in the 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--;}
This is easier to grasp than the implementation using for-loop, does less arithmetic and elegantly evades the gotcha with double reversion.