不使用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循环,它交换元素并维护两个索引:
-
i
指向反转部分的第一个元素,和 -
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()); }