我想将数组传递给函数,不使用Array.Reverse()方法将其反向,然后返回反向数组。在这种情况下,我实际上正在尝试不使用temp变量来执行此操作。 以下是我的代码段。请纠正我在哪里弄错了。
numberOfTaps
答案 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;
}
结果
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字节的临时变量确实没有任何价值。