无论数组是向右还是向左旋转,我们都可以将其转换为向右旋转,这样可以避免对数组下标的判断。
比如要将数组向左旋转3位,可以将其转换为向右旋转n - 3位。
旋转过程中要注意数组位数是否为旋转的位数的倍数,如果不加处理可能就一直在处理那么几个重复的下标。
#include <QCoreApplication>
#include <iostream>
#include <set>
void MoveString(int array[], int size, int n)
{
std::set<int> index_set;
int current_index = 0;
int current_value = array[0];
for(int i = 0; i < size; ++i)
{
if(index_set.find(current_index) != index_set.end())
{
current_index++;
current_value = array[current_index];
}
int index_tmp = (current_index + n) % size;
int value_tmp = array[index_tmp];
array[index_tmp] = current_value;
current_value = value_tmp;
index_set.insert(current_index);
current_index = index_tmp;
}
for(int i = 0; i < size; ++i)
{
std::cout << array[i] << " - ";
}
std::cout << std::endl;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int array[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
MoveString(array, 10, 3);
return a.exec();
}
这里借用了set来记录已经处理过的数组下标。