數組向右旋轉的一種解題思路

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

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