首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何有效地旋转数组?

如何有效地旋转数组?
EN

Stack Overflow用户
提问于 2016-07-20 21:28:44
回答 19查看 18.8K关注 0票数 4

给定一个n整数数组和一个数字d,在该数组上执行左旋转。然后将更新后的数组打印为一行空格分隔的整数。

示例输入:

5 4

1 2 3 4 5

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

示例输出:

5 1 2 3 4

代码语言:javascript
复制
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] + " ");
    }
}

如何使用更少的内存来解决这个问题?

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2016-07-20 21:47:39

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

代码语言:javascript
复制
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);
}
票数 9
EN

Stack Overflow用户

发布于 2018-12-16 15:30:14

这个问题可能有点棘手,但如果熟悉队列和堆栈,也有一个简单的解决方案。我所要做的就是定义一个队列(它将包含给定的数组)和一个Stack。接下来,我只需将出列的索引推送到堆栈中,并将弹出的索引放入队列中,最后返回队列。听起来很迷惑?检查下面的代码:

代码语言:javascript
复制
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();
}
票数 7
EN

Stack Overflow用户

发布于 2016-07-21 21:53:48

你真的需要搬运什么东西吗?如果不是这样,您可以直接移动索引。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38482696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档