一尘不染

如何有效旋转数组?

algorithm

给定n整数和数字d数组,对数组执行左旋转。然后将更新后的数组打印为单行以空格分隔的整数。

输入样例:

5 4
1 2 3 4 5

第一行包含两个以空格分隔的整数,分别表示n(整数数)和d(必须执行的左旋转数)的值。第二行包含用n空格分隔的整数,这些整数描述了数组初始状态的各个元素。

样本输出:

5 1 2 3 4

static void Main(String[] args)
{
    string[] arr_temp = Console.ReadLine().Split(' ');
    int n = Int32.Parse(arr_temp[0]);
    int d = Int32.Parse(arr_temp[1]);

    string[] arr = Console.ReadLine().Split(' ');
    string[] ans = new string[n];

    for (int i = 0; i < n; ++i)
    {
        ans[(i + n - d) % n] = arr[i];
    }

    for (int j = 0; j < n; ++j)
    {
        Console.Write(ans[j] + " ");
    }
}

如何使用较少的内存来解决此问题?


阅读 230

收藏
2020-07-28

共1个答案

一尘不染

在大多数情况下,这将使用较少的内存,因为第二个数组仅与移位一样大。

public static void Main(string[] args)
{
    int[] n = { 1, 2, 3, 4, 5 };
    LeftShiftArray(n, 4);
    Console.WriteLine(String.Join(",", n));
}

public static void LeftShiftArray<T>(T[] arr, int shift)
{
    shift = shift % arr.Length;
    T[] buffer = new T[shift];
    Array.Copy(arr, buffer, shift);
    Array.Copy(arr, shift, arr, 0, arr.Length - shift);
    Array.Copy(buffer, 0, arr, arr.Length - shift, shift);
}
2020-07-28