小编典典

C / C ++-在不使用内置函数的情况下旋转数组的有效方法(作业)

algorithm

任务是向左旋转或向右旋转给定次数的数组子数组。

让我在一个例子中解释一下:

  • 让数据成为数组。

数据= {0、1、2、3、4、5、6、7、8、9};

  • 子数组由参数begin和end决定。

如果开始= 3和结束= 7,则子阵列是{0,1,2, 3,4,5,6,7, 8,9};

如果开始= 7和端= 3,则子阵列是{ 0,1,2,3 ,4,5,6, 7,8,9 };

  • 让我们将其旋转两次

如果开始= 3和结束= 7,则结果为{0,1,2, 6,7,3,4,5, 8,9};

如果开始= 7和端= 3,则结果为{ 8,9,0,1, 4,5,6, 2,3,7 };

我已经编写了执行此任务的代码,但是速度很慢。有人可以给我提示如何使其更快吗?重要说明:除数据,子程序和内置函数外,不允许使用其他数组。

#include <iostream>
using namespace std;

int main(){

    int dataLength;

    cin >> dataLength;

    int data [ dataLength ];

    for (int i = 0; i < dataLength; i++){
        cin >> data [ i ];
    }


    int begin;
    int end;
    int rotation;
    int forLoopLength;
    int tempBefore;
    int tempAfter;

    cin >> begin;
    cin >> end;
    cin >> rotation;

    if (end > begin)
       forLoopLength = (end - begin) + 1;
    else
       forLoopLength = (end - begin) + 1 + dataLength;

    if (rotation < 0) 
       rotation = forLoopLength + (rotation % forLoopLength);
    else
        rotation = rotation % forLoopLength;

    for (int i = 0; i < rotation; i++) {

        tempBefore = data [ end ];

        for (int i = 0; i < forLoopLength; i++) {
            tempAfter = data [ (begin + i) % dataLength ];
            data [ (begin + i) % dataLength ] = tempBefore;
            tempBefore = tempAfter;
        }
    }

    for (int i = 0; i < dataLength; i ++ ) {
        cout << data [ i ] << " ";
    }

    return 0;
}

阅读 184

收藏
2020-07-28

共1个答案

小编典典

这有一个窍门。如果在课堂上没有提到这个技巧,那么您会把它用于家庭作业是很奇怪的。无论如何…

旋转M剩余的N个元素的序列:

  • 颠倒整个序列
  • 反转最后M个元素
  • 反转第一个NM元素

做完了

例如左2:1234567-> 7654321-> 7654312-> 3456712

2020-07-28