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

时间:2011-05-22 13:41:00

标签: c# arrays reverse

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

例如,

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

应该导致

8,9,4,3,1

我把这作为面试任务。

25 个答案:

答案 0 :(得分:33)

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

答案 1 :(得分:8)

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

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

  1. i指向反转部分的第一个元素,
  2. j指向反转部分的最后一个元素。
  3. 重写以代替// 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--;
    }
    

    这比the implementation using for-loop更容易理解,算术更少,优雅地避免双重回归。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

嗯,显然你可以按相反顺序复制到新数组。

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

在考虑缓存行大小和其他内存特征时,可能还有其他算法会略微加快,但除非你处于一个非常严重的性能问题,否则它们是不值得的。

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

那是从数组中看出来的那么简单的开始循环等等,你会明白:)))

        int[] arr = new int[5] { 1, 2, 3, 4, 5 };

        for (int i = arr.Length-1; i >= 0; i--)
        {
            Console.WriteLine(arr[i]);
        }

答案 7 :(得分:1)

["Foo", "Bar"]

答案 8 :(得分: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的任何原因?它可能是算法的优化版本。

答案 9 :(得分:0)

以下是使用 pyinstaller file_name.py 函数和简单的 for 循环反转数组的示例。

Length()

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

您可以使用此方法。

public int[] Reversing(int[] array)
    {
        int[] newArray = new int[array.Length];

        for (int i = 0; i < array.Length; i++)
        {
            newArray[i] = array[array.Length -(i+1)];
        }
        return newArray;
    }

答案 14 :(得分:0)

这是用于反转任何数据类型的数组的动态解决方案。我算法中的一些关键点是首先计算数组长度的一半,并在数组索引具有相同值时添加检查以停止迭代。具有相同索引的阶段描绘它再次开始反向操作。因此,在此阶段,使用“ goto语句”打破外部循环。

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

            }

答案 15 :(得分: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];
  }

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

最好使用Array.Reverse方法

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

您可以阅读更多说明Here

答案 18 :(得分:-1)

   function printReverse(arr) {
      for(var i = arr.length - 1; i >= 0; i--){

    console.log(arr[i]);
      }
   }
printReverse([1, 2, 3, 6, 47, 88]);

&#13;
&#13;
function printReverse(arr) {
    for (var i = arr.length - 1; i >= 0; i--) {

        console.log(arr[i]);
    }
}
printReverse([1, 2, 3, 6, 47, 88])
&#13;
&#13;
&#13;

答案 19 :(得分:-1)

可以使用单个for循环执行此操作..

   int[] arr ={1,3,4,9,8};

   for(int i=arr.length-1;i>=0;i--)
   {
      Console.Write(arr[i]+",");
   }   

答案 20 :(得分:-1)

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

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

答案 21 :(得分:-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);
}

这是我的解决方案。

答案 22 :(得分:-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()
}

答案 23 :(得分:-2)

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

答案 24 :(得分:-3)

你可以向后循环:

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