数组向右旋转的一种解题思路

无论数组是向右还是向左旋转,我们都可以将其转换为向右旋转,这样可以避免对数组下标的判断。
比如要将数组向左旋转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来记录已经处理过的数组下标。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章