不使用Array.Reverse()反转数组

如何在不使用Array.Reverse()方法的情况下反转数组(在C#中)?

例如,

 int[] arr = {1,3,4,9,8}; // some code here Console.WriteLine(string.Join(",", arr)); 

应该导致

 8,9,4,3,1 

我把这作为面试任务。

代替// some code here中的// some code here是:

 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; } 

您应该只遍历数组的前半部分( arr.Length / 2 )。 如果遍历整个数组( arr.Length ),它将被反转两次,产生与它开始之前相同的元素顺序。

 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++; } 

好吧,显然你可以按相反的顺序复制到一个新的数组。

要“就地”进行操作,您可以从两端向中间工作:加载第一个和最后一个元素,然后将它们存储回来,第一个存储到最后一个位置,最后一个存储到第一个位置。 然后执行第二个和倒数第二个等。如果你有偶数个元素,你可以进行N / 2次迭代。 如果是奇数,则进行(N-1)/ 2次迭代,并将中间元素保留在原来的位置。

在考虑缓存行大小和其他内存特征时,可能还有其他算法会略微加快,但除非您处于真正的性能关键状态,否则它们不值得。

你可以通过多种方式实现这一目标,从最快到最愚蠢的方式:

 int[] arr = new int[] { 1,2,3 }; arr = (from a in arr orderby a descending select a).ToArray(); 

但是我无法理解你为什么要追求这样一个徒劳的任务,如果那是为了给某人留下深刻的印象然后用这个来代替for循环:)

 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]); } 

尝试类似的东西:

 var counter = 1; var newArr = new int[arr.length]; for(int i = 0; i < arr.length; i++) { newArr[i] = arr[arr.length - counter]; counter++; } 

我没有测试过,但它应该在正确的轨道上。 你不想使用Array.Reverse的任何原因? 它可能是算法的优化版本。

最好使用Array.Reverse方法

 int[] arr ={1,3,4,9,8}; Array.Reverse(arr); 

你可以在这里阅读更多描述

 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; } 

//不使用Reverse方法而不使用其他数组//从最后一个元素开始尝试yield运算符

 public IEnumerable Reverse (int[] array) { for (int i = array.Length - 1; i >= 0; i--) { yield return array [i]; } } 

基本上,您被要求重新实现Array.Reverse(Array) 。 如果你看看它是如何在框架中实现的并且忽略了许多技术细节,你会发现它只是在整个数组上调用它的三参数版本(它反转了数组的指定部分)。

Array.Reverse(Array,Int32,Int32)是一个while循环,它交换元素并维护两个索引:

  1. i指向反转部分的第一个元素,和
  2. j指向反转部分的最后一个元素。

重写代替// some code here中的// some code here

 int i = 0; int j = arr.Length - 1; while (i < j) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j--; } 

这比使用for-loop的实现更容易掌握,算法更少,并且通过双重回归优雅地避开了这个问题。

那就是来自Array legth的So Simple Start循环等等,你会明白:)))

  int[] arr = new int[5] { 1, 2, 3, 4, 5 }; for (int i = arr.Length-1; i >= 0; i--) { Console.WriteLine(arr[i]); } 

我根本不擅长循环。 但这对我来说似乎很简单 –

  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]; } 
 Stack stack=new Stack; var newArr = new int[arr.length]; for(int i = 0; i < arr.length; i++) { stack.push(arrr[i]) } for(int i = 0; i < arr.length; i++) { newarr[i]= stack.pop() } 
 int[] array1 = { 1, 2, 3, 4, 5 }; for (int x = 4; x < array1.Length && x != -1; x--) { int tmp; tmp=array1[x]; Console.Write("{0} ", tmp); } 

这是我的解决方案。

 int[] triangles = new int[]{0,1,2,3} for (int j = triangles.Length; j > (triangles.Length / 2); j--) { var temp = triangles[j - 1]; triangles[j - 1] = triangles[triangles.Length - j]; triangles[triangles.Length - j] = temp; } 

我宁愿从它的末尾反转一个数组。 我的解决方案在上面。

可以用单个for循环来做到这一点..

  int[] arr ={1,3,4,9,8}; for(int i=arr.length-1;i>=0;i--) { Console.Write(arr[i]+","); } 
  function printReverse(arr) { for(var i = arr.length - 1; i >= 0; i--){ console.log(arr[i]); } } printReverse([1, 2, 3, 6, 47, 88]); 
 function printReverse(arr) { for (var i = arr.length - 1; i >= 0; i--) { console.log(arr[i]); } } printReverse([1, 2, 3, 6, 47, 88]) 
 Console.WriteLine("Enter a string"); string input = Console.ReadLine(); string s = ""; for (int i = input.Length-1 ; i >= 0; i--) { s = s + input[i]; } Console.WriteLine(s); 

你可以向后循环:

 int[] arr= new int[] {1, 2, 3, 4, 6}; for(int i=arr.Length-1 ;i>= 0 ; i--) { Console.WriteLine(arr[i].ToString()); }