如何在不使用Array.Reverse()
方法的情况下反转数组(在C#中)?
例如,
int[] arr = {1,3,4,9,8};
// some code here
Console.WriteLine(string.Join(",", arr));
应该导致
8,9,4,3,1
我把这作为面试任务。
答案 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循环,它交换元素并维护两个索引:
i
指向反转部分的第一个元素,j
指向反转部分的最后一个元素。 重写以代替// 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)
答案 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]);
function printReverse(arr) {
for (var i = arr.length - 1; i >= 0; i--) {
console.log(arr[i]);
}
}
printReverse([1, 2, 3, 6, 47, 88])
&#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());
}