给定一个 n 整数数组和一个数字 d ,对数组执行左旋转。然后将更新后的数组打印为单行以空格分隔的整数。
Given an array of n integers and a number, d, perform left rotations on the array. Then print the updated array as a single line of space-separated integers.
样本输入:
5 4 1 2 3 4 5
5 4 1 2 3 4 5
第一行包含两个以空格分隔的整数,分别表示 n (整数的数量)和 d (您必须执行的左旋转次数)。 第二行包含 n 用空格分隔的整数,描述数组初始状态的各个元素。
The first line contains two space-separated integers denoting the respective values of n (the number of integers) and d (the number of left rotations you must perform). The second line contains n space-separated integers describing the respective elements of the array's initial state.
示例输出:
5 1 2 3 4
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] + " "); } }
如何使用较少的内存来解决此问题? / p>
How to use less memory to solve this problem?
推荐答案在大多数情况下,这将使用较少的内存,因为第二个数组仅与移位一样大。
This will use less memory in most cases as the second array is only as big as the shift.
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); }