数据结构:将一个具有n个元素的数组向左循环移动i个位置

#include <iostream>

using namespace std;

/*
    问题描述:将一个具有n个元素的数组向左循环移动i个位置。
*/

/*将数据反转的实现*/
void reverses(char *arr, int start, int over)
{
    for(; start < over; start++, over--)
    {
        char temp = arr[start];
        arr[start] = arr[over];
        arr[over] = temp;
    }
}

/*将数据反转*/
void converse(char *arr, int n, int i)
{
    // 先反转前i个元素
    reverses(arr, 0, i - 1);
    // 再反转剩下的n-i个元素
    reverses(arr, i, n - 1);
    // 最后将整个数组反转
    reverses(arr, 0, n - 1);
    for(int j = 0; j < n; j++)
    {
        cout << arr[j] << ' ';
    }
}

int main()
{
    // 定义一个字符数组
    char arr[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
    converse(arr, 10, 5);
    return 0;
}


说明:

以上数组arr,我们可以看成是数组ab转换为数组ba(a代表数组前i个元素,b代表数组余下的n-i个元素),先将a逆置得到a’b,再将b逆置得到a’b’,最后将整个a’b’逆置得到(a’b’)’ = ba。

例如:

对于abcdefghij,将其分成两部分,abcde 和 fghij,

1.先将abcde逆置得到edcba

2.再将fghij逆置得到jihgf

        两次逆置之后得到:edcbajihgf

3.将edcbajihgf逆置得到:fghijabcde

算法分析:

该算法不需要额外开辟空间,空间复杂度为O(1),时间复杂度为O(n)

猜你喜欢

转载自blog.csdn.net/weixin_38178449/article/details/82929733