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

问题描述 投票:0回答:24

如何在不使用

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

例如,

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

应该导致

8,9,4,3,1

我得到了这个作为面试任务。

c# arrays reverse
24个回答
60
投票

问题中替换

// 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
),它将被反转两次,产生与开始之前相同的元素顺序。


17
投票

基本上,你会被要求重新实现

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

Array.Reverse(Array,Int32,Int32)

是一个 while 循环,用于交换元素并维护两个索引:


    i
  1. 指向反转部分的第一个元素,并且
  2. j
  3. 指向反转部分的最后一个元素。
    
    
    
  4. 重写以替换问题中的
// 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 循环的实现更容易掌握,执行的算术更少,并且通过双重回归优雅地避免了陷阱。

这非常简单,从数组长度开始循环等等,观看代码,您就会明白:)))

3
投票
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++;
}

2
投票
嗯,显然你可以以相反的顺序复制到一个新数组。

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

在考虑缓存行大小和其他内存特性时,可能还有其他算法会稍微快一些,但除非您处于真正对性能至关重要的情况,否则它们不值得。

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
投票
// 不使用Reverse方法并且不使用额外的数组
// 从最后一个元素开始尝试yield运算符

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

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
投票
尝试类似:

0
投票
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 吗?它可能是算法的优化版本。
    

您可以通过多种方式做到这一点,从最快的到最愚蠢的,例如:

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

但我不明白你为什么要追求这样一个徒劳的任务,如果这是为了给某个地方的某人留下深刻印象,那么就使用它而不是 for 循环:)
    

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

0
投票
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
投票
”打破外循环。

string[] unreversed = {"A","B","C","D","E","F","G","H","I","J","K"}; int q=unreversed.Length; int t = q / 2; var temp1 = "A"; for(int i = 0;i<unreversed.Length;i++) { q = q - 1; for(int k=q;k<=q;k++) { if (unreversed[k] != unreversed[i] && i!=t) { temp1 = unreversed[i]; unreversed[i] = unreversed[k]; unreversed[k] = temp1; } else { goto printarray; } } } printarray: foreach (var k in unreversed) { Console.WriteLine(k); }

//Create temp array with the same size.
int[] arrTemp = new int[arr.Length];
int i = 0;
//Assign last value of arr to first value of arrTemp
for (int j = arr.Length - 1; j >= 0; j--)
{
    arrTemp[i] = arr[j];
    i++;
}
arr = arrTemp;

0
投票
我更喜欢使用索引的 LINQ 表达式:

0
投票
using System.Linq; int[] arr = { 1, 3, 4, 9, 8 }; arr = arr.Select((n, idx) => new {n, idx}) .OrderByDescending(r => r.idx) .Select(r => r.n).ToArray();

您可以尝试这个,无需使用额外的临时变量:

0
投票
for(int i = left; i < right/2; i++) { (nums[i], nums[right - i - 1]) = (nums[right - i - 1], nums[i]); }


0
投票

using System; public class Program { public static void Main() { int[] arr = new int[] { 1, 2, 3, 4, 5, 6 }; //--------------------------------------------------------------------------------------------------------------------- // 1 Print Array as 1, 2, 3, 4, 5, 6 //--------------------------------------------------------------------------------------------------------------------- Console.WriteLine(string.Join(",", arr)); //--------------------------------------------------------------------------------------------------------------------- // 2> Write code to reverse it //--------------------------------------------------------------------------------------------------------------------- int temp=0; int left=0,right=arr.Length-1; while(left<right) { temp=arr[left]; arr[left]=arr[right]; arr[right]=temp; left++; right--; } //--------------------------------------------------------------------------------------------------------------------- // 3> Print reversed Array as 6, 5, 4, 3, 2, 1 //--------------------------------------------------------------------------------------------------------------------- Console.WriteLine(string.Join(",", arr)); }

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()
}

-1
投票
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);
}

-1
投票
这就是我的解决方案。
    

最好使用Array.Reverse方法

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

您可以阅读更多说明
这里

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

-1
投票
我更喜欢从数组的末尾反转数组。我的解决方案如上。
    

public int[] Reverse(params int[] numbers) { for (int i = 0; i < numbers.Length / 2; i++) { int tmp = numbers[i]; numbers[i] = numbers[numbers.Length - i - 1]; numbers[numbers.Length - i - 1] = tmp; } return numbers; }

-1
投票
这是使用 

-1
投票
函数和简单的 for 循环反转数组的示例。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            int[] arr = new int[] {4, 8, 2, 9, 5, 5};
            
            int length = arr.Length;
            
            for(int i = 0; i < arr.Length; i++)
            {
               Console.WriteLine(arr[length-1] + " ");
               length = length - 1;
            }            
        }        
    }
}

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

-2
投票
可以用单个 for 循环来做到这一点..

-2
投票
int[] arr ={1,3,4,9,8}; for(int i=arr.length-1;i>=0;i--) { Console.Write(arr[i]); }


© www.soinside.com 2019 - 2024. All rights reserved.