如何在不使用
Array.Reverse()
方法的情况下反转数组(在 C# 中)?
例如,
int[] arr = {1,3,4,9,8};
// some code here
Console.WriteLine(string.Join(",", arr));
应该导致
8,9,4,3,1
我得到了这个作为面试任务。
问题中替换
// 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
),它将被反转两次,产生与开始之前相同的元素顺序。
Array.Reverse(Array)
。如果你看看它是如何在框架中实现的,并忽略周围的许多技术细节,你会发现它只是在整个数组上调用它的三参数版本(反转数组的指定部分)。
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--;
}
这比使用 for 循环的实现更容易掌握,执行的算术更少,并且通过双重回归优雅地避免了陷阱。这非常简单,从数组长度开始循环等等,观看代码,您就会明白:)))
int[] arr = new int[5] { 1, 2, 3, 4, 5 };
for (int i = arr.Length-1; i >= 0; i--)
{
Console.WriteLine(arr[i]);
}
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++;
}
在考虑缓存行大小和其他内存特性时,可能还有其他算法会稍微快一些,但除非您处于真正对性能至关重要的情况,否则它们不值得。
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;
}
public IEnumerable<int> Reverse (int[] array)
{
for (int i = array.Length - 1; i >= 0; i--) {
yield return array [i];
}
}
char[] strx = { '1','2','3','4','5','6','7','8','9' };
int i = strx.Length;
string ktr ="";
while (i>0)
{
i--;
ktr += strx[i];
if (i==0)
{
i = strx.Length;
while (i > 0)
{
i--;
strx[i] = ktr[i];
}
}
}
int j;
Console.WriteLine("Array strx in reverse order: ");
for (j = 0; j < strx.Length; j++ )
{
Console.Write("{0}", strx[j]);
}
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 吗?它可能是算法的优化版本。
您可以通过多种方式做到这一点,从最快的到最愚蠢的,例如:
int[] arr = new int[] { 1,2,3 };
arr = (from a in arr orderby a descending select a).ToArray();
但我不明白你为什么要追求这样一个徒劳的任务,如果这是为了给某个地方的某人留下深刻印象,那么就使用它而不是 for 循环:)
我根本不擅长循环。但这对我来说似乎很简单 -
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];
}
这是反转任何数据类型的数组的动态解决方案。我的算法中的一些关键点是首先计算数组长度的一半,并添加检查以在数组索引具有相同值时停止迭代。具有相同索引的阶段描述了这一点它再次开始反向操作。所以在这个阶段使用“
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);
}
//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;
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();
您可以尝试这个,无需使用额外的临时变量:
for(int i = left; i < right/2; i++)
{
(nums[i], nums[right - i - 1]) = (nums[right - i - 1], nums[i]);
}
using System;
public class Program { public static void Main() { int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
//---------------------------------------------------------------------------------------------------------------------
// 1 Print Array as 1, 2, 3, 4, 5, 6
//---------------------------------------------------------------------------------------------------------------------
Console.WriteLine(string.Join(",", arr));
//---------------------------------------------------------------------------------------------------------------------
// 2> Write code to reverse it
//---------------------------------------------------------------------------------------------------------------------
int temp=0;
int left=0,right=arr.Length-1;
while(left<right)
{
temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
left++;
right--;
}
//---------------------------------------------------------------------------------------------------------------------
// 3> Print reversed Array as 6, 5, 4, 3, 2, 1
//---------------------------------------------------------------------------------------------------------------------
Console.WriteLine(string.Join(",", arr));
}
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()
}
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);
}
最好使用Array.Reverse方法
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;
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
int[] arr = new int[] {4, 8, 2, 9, 5, 5};
int length = arr.Length;
for(int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[length-1] + " ");
length = length - 1;
}
}
}
}
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);
int[] arr ={1,3,4,9,8};
for(int i=arr.length-1;i>=0;i--)
{
Console.Write(arr[i]);
}