给定一个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] + " ");
}
}
如何使用更少的内存来解决这个问题?
发布于 2016-07-20 21:47:39
在大多数情况下,这将使用较少的内存,因为第二个数组仅与移位一样大。
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);
}
发布于 2018-12-16 15:30:14
这个问题可能有点棘手,但如果熟悉队列和堆栈,也有一个简单的解决方案。我所要做的就是定义一个队列(它将包含给定的数组)和一个Stack。接下来,我只需将出列的索引推送到堆栈中,并将弹出的索引放入队列中,最后返回队列。听起来很迷惑?检查下面的代码:
static int[] rotLeft(int[] a, int d) {
Queue<int> queue = new Queue<int>(a);
Stack<int> stack = new Stack<int>();
while(d > 0)
{
stack.Push(queue.Dequeue());
queue.Enqueue(stack.Pop());
d--;
}
return queue.ToArray();
}
发布于 2016-07-21 21:53:48
你真的需要搬运什么东西吗?如果不是这样,您可以直接移动索引。
https://stackoverflow.com/questions/38482696
复制相似问题