【发布时间】:2016-02-24 23:02:52
【问题描述】:
任务是将数组的子数组向左或向右旋转给定次数。
让我用一个例子来解释一下:
- 让数据成为一个数组。
数据 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
- 子数组由参数 begin 和 end 确定。
如果 begin = 3 且 end = 7,则子数组为 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
如果 begin = 7 且 end = 3,则子数组为 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ;
- 让我们向右旋转两次
如果 begin = 3 且 end = 7,则结果为 {0, 1, 2, 6, 7, 3, 4, 5, 8, 9};
如果 begin = 7 和 end = 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;
}
【问题讨论】:
-
using namespace std;+ 名为begin和end的变量注定会发生灾难。 -
如果您的代码已经正常工作,但您正在寻求改进它的提示,您也可以在Code Review 上提问。如果您决定这样做,请在此处删除问题,因为不赞成重复发布。
-
请选择一种语言。
-
@ltw 你有没有想过看他的链接?
标签: c++ arrays algorithm performance