任务是向左旋转或向右旋转给定次数的数组子数组。
让我在一个例子中解释一下:
数据= {0、1、2、3、4、5、6、7、8、9};
如果开始= 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; }
这有一个窍门。如果在课堂上没有提到这个技巧,那么您会把它用于家庭作业是很奇怪的。无论如何…
旋转M剩余的N个元素的序列:
做完了
例如左2:1234567-> 7654321-> 7654312-> 3456712