無論數組是向右還是向左旋轉,我們都可以將其轉換爲向右旋轉,這樣可以避免對數組下標的判斷。
比如要將數組向左旋轉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來記錄已經處理過的數組下標。