c# - 将数组传递给函数,在不使用 Array.Reverse() 方法的情况下将其反转并返回反转后的数组
问题描述
我想将一个数组传递给一个函数,在不使用 Array.Reverse() 方法的情况下反转它并返回反转后的数组。在这种情况下,我实际上是在尝试不使用 temp 变量来做到这一点。下面是我的代码片段。请纠正我在哪里弄错了。
class Program
{
static void Main(string[] args)
{
int[] array = { 1, 2, 3, 4, 5 };
int[] reverse = new int[5];
reverse = ReverseArray(array, reverse);
foreach (int item in reverse)
{
Console.WriteLine(reverse);
}
}
public static int[] ReverseArray(int[] arr, int[] rev)
{
int x = arr.Length - 1;
for (int i = 0; i <= x; i++)
{
rev[i] = arr[x];
x--;
}
return rev;
}
}
解决方案
在这种情况下,我实际上是在尝试不使用 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];
}
}
我们已经检查了 in 中的每一个元素,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 字节的临时变量确实没有任何价值。
推荐阅读
- python - 方法名称未定义错误,即使它在上面在 python 中定义
- firebase - 使用 firebase 云功能删除文件
- php - 在弹出窗口中渲染列表
- android - ListView Flutter 中的文本溢出问题
- go - 如何在另一个文件中访问包 main 的另一个功能?
- c# - Selenium UI 测试通过本地测试但在 VSTS CI 上失败
- laravel - 邮递员:传递 laravel 护照令牌时“无法得到任何响应”
- postgresql - 从没有任何 PID 的 postgres 9.6.6 中删除 pg_lock
- javascript - 如何使用 jquery 验证所需的 Title 字段集?
- javascript - Ext.draw.container 无法在 Ext.JS 6.5.1 和更新版本中加载