class Program
{
//比如一個數組 1 2 3 4 5 6 循環右移 2 位,將變成 5 6 1 2 3 4, 經過觀察,可以看到1 2 3 4 部分的順序在移位前後的相對位置並沒有變化,只是5 6 放在了最前面。
//因此思路可爲:1)先化分爲兩部分:1 2 3 4 | 5 6,然後將1 2 3 4逆序,再將5 6 逆序,得到5 6 1 2 3 4
public static void Main(string[] args)
{
int[] arr = { 1,2,3,4,5,6};
int n = 14;
Remove(arr, n);
foreach (int item in arr)
{
Console.Write(item);
Console.Write(" ");
}
Console.ReadKey();
}
/// <summary>
/// 反轉
/// </summary>
/// <param name="arr">數據</param>
/// <param name="start">起始下標</param>
/// <param name="end">結束下標</param>
private static void Revices(int[] arr,int start, int end)
{
int temp = 0;
while (start<end)
{
temp = arr[start];
arr[start++] = arr[end];
arr[end--] = temp;
}
}
/// <summary>
/// 移位
/// </summary>
/// <param name="arr">數組</param>
/// <param name="n">要移動的位數</param>
private static void Remove(int[] arr, int n)
{
//當移動的位置超過數據長度時
if (n > arr.Length)
{
n = n % arr.Length;
}
//k 數組的長度
int k = arr.Length;
Revices(arr, 0, k - n - 1);
Revices(arr, k - n, k - 1);
Revices(arr, 0, k-1);
}
}
//第一次反轉: 4 3 2 1 5 6
//第二次反轉: 4 3 2 1 6 5
//第三次反轉: 5 6 1 2 3 4