将数组传递给函数,不使用Array.Reverse()方法将其反向,然后返回反向数组

时间:2018-10-22 15:57:02

标签: c#

我想将数组传递给函数,不使用Array.Reverse()方法将其反向,然后返回反向数组。在这种情况下,我实际上正在尝试不使用temp变量来执行此操作。 以下是我的代码段。请纠正我在哪里弄错了。

numberOfTaps

2 个答案:

答案 0 :(得分:1)

x可能不需要递减,您可以使用arr.Length - 1 - i代替x来获取数组索引,否则,您将只能使用一半的数组。

public static int[] ReverseArray(int[] arr, int[] rev)
{
    int x = arr.Length - 1;
    for (int i = 0; i <= x; i++)
    {
        rev[i] = arr[arr.Length - 1 - i];
    }
    return rev;
}

我只会为方法传递一个数组be,并且您可以在方法中声明反向数组。

public static int[] ReverseArray(int[] arr)
{
    int[] reverse = new int[arr.Length];
    int x = arr.Length - 1;
    for (int i = 0; i <= x; i++)
    {
        reverse[i] = arr[arr.Length - 1 - i];
    }
    return reverse;
}

c# online

结果

5
4
3
2
1

答案 1 :(得分:1)

  

在这种情况下,我实际上是在尝试不使用temp变量的情况。

让我们先忽略此位,并在有意义的地方使用temp变量。我们可以回到它。

我们可以通过几种不同的方式来处理“反转数组”的一般问题。我们可以就地反转数组本身,我们可以创建一个与给定数组相反的新数组,也可以填充另一个给定数组,使其与我们给定的第一个数组相反。您的解决方案将这三种方法混合在一起,因此无法正确地进行任何处理。

要填充第二个数组,我们得到了一个不需要温度的信息,因为我们没有交换空间,我们也不想在中间点停下来:

static void Main(string[] args)
{
    int[] array = { 1, 2, 3, 4, 5 };
    int[] reverse = new int[5];
    ReverseArray(array, reverse);

    foreach (int item in reverse)
    {
        Console.WriteLine(item);
    }
}

public static void ReverseArray(int[] arr, int[] rev)
{
    int x = arr.Length - 1;
    for (int i = 0; i < arr.Length; i++, x--)
    {
        rev[i] = arr[x];
    }
}

我们遍历了arr中的每个元素,并将其放在rev中的相关位置。

要返回一个新数组,我们做了很多相同的事情,但是在方法本身内创建了新数组:

static void Main(string[] args)
{
    int[] array = { 1, 2, 3, 4, 5 };
    int[] reverse = ReverseArray(array);

    foreach (int item in reverse)
    {
        Console.WriteLine(item);
    }
}

public static int[] ReverseArray(int[] arr)
{
    int[] rev = new int[arr.Length];
    int x = arr.Length - 1;
    for (int i = 0; i < arr.Length; i++, x--)
    {
        rev[i] = arr[x];
    }

    return rev;
}

它的一个变体根本不会创建一个新数组,而只是对其进行迭代,从而生成一个IEnumerable<int>。这样可以更快地返回第一个结果,并且不会在大型数组中使用过多的内存,但是每次使用时都会重新执行反向操作,因此其用途也有所不同:

static void Main(string[] args)
{
    int[] array = { 1, 2, 3, 4, 5 };
    IEnumerable<int> reverse = ReverseArray(array);

    foreach (int item in reverse)
    {
        Console.WriteLine(item);
    }
}

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

要就地反转数组,我们想从外部到中间交换元素:

static void Main(string[] args)
{
    int[] array = { 1, 2, 3, 4, 5 };
    ReverseArray(array);

    foreach (int item in array)
    {
        Console.WriteLine(item);
    }
}

public static void ReverseArray(int[] arr)
{
    int x = arr.Length - 1;
    for (int i = 0; i < x; i++, x--)
    {
        int temp = arr[x];
        arr[x] = arr[i];
        arr[i] = temp;
    }
}

这会破坏您的任意无温度变量规则。尽管这样做没有任何实际价值,但我们可以通过一点点花招来解决这个问题。

static void Main(string[] args)
{
    int[] array = { 1, 2, 3, 4, 5 };
    ReverseArray(array);

    foreach (int item in array)
    {
        Console.WriteLine(item);
    }
}

public static void ReverseArray(int[] arr)
{
    int x = arr.Length - 1;
    for (int i = 0; i < x; i++, x--)
    {
        arr[x] ^= arr[i];
        arr[i] ^= arr[x];
        arr[x] ^= arr[i];
    }
}

虽然不使用4字节的临时变量确实没有任何价值。