我怎样才能旋转这个数组?
How can I rotate this array?
我的代码运行良好,但方向相反(左)我想将此数组向右旋转,我该怎么做?
public int[] RotateArray(int[] A) {
for(int i = 0 ;i < A.Length - 1;i++)
{
int aux = A[i+1];
A[i+1] = A[i];
A[i] = aux;
// Aux = A[i];
}
return A;
}
我得到的结果:
[4,5,2,3] => [5,2,3,4]
想要的结果:
[4,5,2,3] => [3,4,5,2]
尝试从后面遍历数组:
注意:我将方法更改为 void
,因为从它的外观来看,您无论如何都在尝试 in-place 解决方案.
using System;
public class Program {
public static void RotateArray(int[] A) {
if (A == null || A.Length <= 1) {
return;
}
int lastElement = A[A.Length - 1];
for (int i = A.Length - 1; i > 0; i--) {
A[i] = A[i - 1];
}
A[0] = lastElement;
}
public static void Main(string[] args) {
int[] array = new int[] { 4, 5, 2, 3 };
Console.WriteLine("Before: [{0}]", string.Join(", ", array));
RotateArray(array);
Console.WriteLine("After: [{0}]", string.Join(", ", array));
}
}
输出:
Before: [4, 5, 2, 3]
After: [3, 4, 5, 2]
如果您只想将最后一个位置移到第一个位置,您可以(错误)使用 Array.Copy,源和目标引用同一个数组。
int[] arr = { 4, 5, 2, 3 };
var last = arr[^1];
Array.Copy(arr, 0, arr , 1, arr.Length -1);
arr[0] = last; // -> now 3, 4, 5, 2
这里是 one-liner 使用 Linq 如果你想走那条路。 (注意:没有错误检查,但适用于至少包含一个元素的数组)。
本质上,您利用 Linq 获取前 (N - 1) 个元素并添加最后一个元素。
var original = new int[] { 4,5,2,3 };
var rotated =
original
.Take(original.Length - 1)
.Prepend(
original.Last())
.ToArray();
我的代码运行良好,但方向相反(左)我想将此数组向右旋转,我该怎么做?
public int[] RotateArray(int[] A) {
for(int i = 0 ;i < A.Length - 1;i++)
{
int aux = A[i+1];
A[i+1] = A[i];
A[i] = aux;
// Aux = A[i];
}
return A;
}
我得到的结果:
[4,5,2,3] => [5,2,3,4]
想要的结果:
[4,5,2,3] => [3,4,5,2]
尝试从后面遍历数组:
注意:我将方法更改为 void
,因为从它的外观来看,您无论如何都在尝试 in-place 解决方案.
using System;
public class Program {
public static void RotateArray(int[] A) {
if (A == null || A.Length <= 1) {
return;
}
int lastElement = A[A.Length - 1];
for (int i = A.Length - 1; i > 0; i--) {
A[i] = A[i - 1];
}
A[0] = lastElement;
}
public static void Main(string[] args) {
int[] array = new int[] { 4, 5, 2, 3 };
Console.WriteLine("Before: [{0}]", string.Join(", ", array));
RotateArray(array);
Console.WriteLine("After: [{0}]", string.Join(", ", array));
}
}
输出:
Before: [4, 5, 2, 3]
After: [3, 4, 5, 2]
如果您只想将最后一个位置移到第一个位置,您可以(错误)使用 Array.Copy,源和目标引用同一个数组。
int[] arr = { 4, 5, 2, 3 };
var last = arr[^1];
Array.Copy(arr, 0, arr , 1, arr.Length -1);
arr[0] = last; // -> now 3, 4, 5, 2
这里是 one-liner 使用 Linq 如果你想走那条路。 (注意:没有错误检查,但适用于至少包含一个元素的数组)。
本质上,您利用 Linq 获取前 (N - 1) 个元素并添加最后一个元素。
var original = new int[] { 4,5,2,3 };
var rotated =
original
.Take(original.Length - 1)
.Prepend(
original.Last())
.ToArray();